.htaccess htaccess与子文件夹和页面具有相同的名称

mwecs4sa  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(121)

我有一个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]
nhjlsmyf

nhjlsmyf1#

我有一个work.html和一个名为work的文件夹...每个页面的URL中都没有html,但当我返回example.com/work时,我得到了一个404。

  • 旁白:* 通常我会认为这会导致403,而不是404,除非mod_autoindex没有安装在您的服务器上?(或者.htaccess文件中有其他指令?)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html [NC,L]

正如@CBroe在注解中指出的,第一个 conditionRewriteCond指令)明确排除了“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文件是否存在的条件并不是测试您最终在RewriteRulesubstitution 字符串中重写的内容。)
因此,您应该将规则改为如下形式:

# Disable directory listings (mod_autoindex)
Options -MultiViews -Indexes

# Prevent mod_dir appending the trailing slash to directories
DirectorySlash Off

RewriteEngine On

# Append ".html" extension if the target file exists.
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule (.+) $1.html [L]

这里不需要RewriteRule指令上的NC标志,因为该模式已经匹配了小写和大写字母。
在测试之前,您需要清除浏览器缓存,因为附加了尾部斜杠的错误的301(永久)重定向将被浏览器缓存。
您可以通过排除已经包含文件扩展名的请求(例如. physical文件),或者仅仅排除您的静态资产子目录来进一步优化上述“无扩展名”重写(这留给读者作为练习)。
不用说,在管理无扩展名的URL时,最好避免文件与现有目录具有相同基名的情况,因为这自然会产生歧义。

相关问题