我有一个work.html
和一个名为work
的文件夹,里面有很多页面,每个页面的URL中都没有.html
,但是当我返回example.com/work
时,我得到了一个404,但是当我键入example.com/work.html
时,它工作正常。
作为参考,
example.com/work/piece1
工作正常example.com/work/piece2
工作正常
我应该在htaccess里有别的东西吗?
我用的是.htaccess
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html [NC,L]
1条答案
按热度按时间nhjlsmyf1#
我有一个
work.html
和一个名为work
的文件夹...每个页面的URL中都没有html,但当我返回example.com/work
时,我得到了一个404。.htaccess
文件中有其他指令?)正如@CBroe在注解中指出的,第一个 condition(
RewriteCond
指令)明确排除了“directories”(文件系统上的物理目录),因此当请求一个目录(即/work
)时,该规则被绕过。因此,第一个条件需要删除(无论如何,在检查请求+
.html
是否Map到文件之前,没有必要检查这两个条件......请求是否Map到目录--这是两个互斥的事件,除非您有扩展名为.html
的目录?!)但是,这只是问题的一部分,您不能简单地删除 condition 并期望它工作。因为
/work
是一个物理目录,mod_dir将尝试附加一个带有301重定向的尾部斜杠(为了“修复”URL)。因此/work
被重定向到/work/
,然后导致规则在内部将请求重写为/work/.html
(因为REQUEST_FILENAME
不包含尾部斜杠*****)-这将导致404。您需要防止mod_dir“fixing”但是这里面还有更多的问题...目录列表 * 必须 * 被禁用以防止意外泄露你的文件结构(如果mod_autoindex被安装和启用),并且子目录中的任何DirectoryIndex
文档将不再是可访问的(除非你手动检查这一点并根据需要附加尾部斜杠)。(*****这是此规则的另一个问题...检查对应的
.html
文件是否存在的条件并不是测试您最终在RewriteRule
substitution 字符串中重写的内容。)因此,您应该将规则改为如下形式:
这里不需要
RewriteRule
指令上的NC
标志,因为该模式已经匹配了小写和大写字母。在测试之前,您需要清除浏览器缓存,因为附加了尾部斜杠的错误的301(永久)重定向将被浏览器缓存。
您可以通过排除已经包含文件扩展名的请求(例如. physical文件),或者仅仅排除您的静态资产子目录来进一步优化上述“无扩展名”重写(这留给读者作为练习)。
不用说,在管理无扩展名的URL时,最好避免文件与现有目录具有相同基名的情况,因为这自然会产生歧义。