.htaccess删除文件扩展名与同名文件夹冲突
我正在使用.htaccess文件从url中删除文件扩展名(如.html)。文件中的代码工作正常,但只要存在与文件同名但没有扩展名的文件夹,它就会重定向到该文件夹,而不是重定向到该文件。例如,如果我在同一目录中有一个.htaccess删除文件扩展名与同名文件夹冲突,.htaccess,.htaccess,我正在使用.htaccess文件从url中删除文件扩展名(如.html)。文件中的代码工作正常,但只要存在与文件同名但没有扩展名的文件夹,它就会重定向到该文件夹,而不是重定向到该文件。例如,如果我在同一目录中有一个demo.html文件和一个demo文件夹,只要我在浏览器的搜索栏中键入www.example.com/demo,它就会重定向到该文件夹,而不是该文件。如果我删除文件夹并再次键入相同的内容,它将非常有效!任何帮助都将不胜感激:) 以下是.htaccess文件中的代码: RewriteC
demo.html
文件和一个demo
文件夹,只要我在浏览器的搜索栏中键入www.example.com/demo
,它就会重定向到该文件夹,而不是该文件。如果我删除文件夹并再次键入相同的内容,它将非常有效!任何帮助都将不胜感激:)
以下是.htaccess文件中的代码:
RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]
这是由与mod_dir的冲突引起的。当您请求一个没有尾随斜杠的目录时,mod_dir将“修复”URL并附加一个带有301重定向的尾随斜杠。之后,它将尝试提供DirectoryIndex文档。这优先于您的内部重写 要解决此问题,您需要使用
DirectorySlash Off
禁用此行为
例如:
# Ensure that directory listings are disabled
Options -Indexes
# Prevent mod_dir appending a slash to physical directories
DirectorySlash Off
# Redirect to remove the ".html" extension
RewriteCond %{THE_REQUEST} /([^.?]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R=301]
# Rewrite request to append ".html" extension if it exists
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule (.*) $1.html [L]
禁用DirectorySlash
时,需要禁用目录列表(mod_autoindex),因为如果启用mod_autoindex,那么当您请求不带斜杠的目录时,无论您是否有directorysindex
文档(例如index.html
),都将生成目录列表在该目录中,通常会阻止生成目录列表
此外,我还“修复”了您现有的删除和附加.html
扩展名的规则。删除扩展名.html
的第一条规则可能与查询字符串中出现的.html
实例相匹配。如果请求/demo/
,则附加.html
扩展名的第二条规则将导致重写循环(500错误)――其中demo
是目录和文件基名(如您的示例所示)
有关此潜在重写循环的更多信息,请参阅有关ServerFault的相关问题:
- 这是由于与mod_dir发生冲突造成的。当您请求一个没有尾随斜杠的目录时,mod_dir将“修复”URL并附加一个带有301重定向的尾随斜杠。之后,它将尝试提供DirectoryIndex文档。这优先于您的内部重写
要解决此问题,您需要使用
DirectorySlash Off
禁用此行为
例如:
# Ensure that directory listings are disabled
Options -Indexes
# Prevent mod_dir appending a slash to physical directories
DirectorySlash Off
# Redirect to remove the ".html" extension
RewriteCond %{THE_REQUEST} /([^.?]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R=301]
# Rewrite request to append ".html" extension if it exists
RewriteCond %{DOCUMENT_ROOT}/$1.html -f
RewriteRule (.*) $1.html [L]
禁用DirectorySlash
时,需要禁用目录列表(mod_autoindex),因为如果启用mod_autoindex,那么当您请求不带斜杠的目录时,无论您是否有directorysindex
文档(例如index.html
),都将生成目录列表在该目录中,通常会阻止生成目录列表
此外,我还“修复”了您现有的删除和附加.html
扩展名的规则。删除扩展名.html
的第一条规则可能与查询字符串中出现的.html
实例相匹配。如果请求/demo/
,则附加.html
扩展名的第二条规则将导致重写循环(500错误)――其中demo
是目录和文件基名(如您的示例所示)
有关此潜在重写循环的更多信息,请参阅有关ServerFault的相关问题:
DirectorySlash
并启用mod_autoindex(即生成目录列表)时,当你请求没有斜杠的目录时,mod_autoindex将生成目录列表,尽管该目录中可能有一个DirectoryIndex
文档通常会阻止目录列表的生成。我还更新了您现有的规则,因为存在一些“漏洞”。我用更多的解释更新了我的答案。@White先生,++ve谢谢你的回答,谢谢你和我一起欢呼。哇,非常好,谢谢你!只是一个简单的问题,为什么我必须禁用目录列表?我读到他们可能是一个安全威胁,是因为吗?是的,当你禁用DirectorySlash
并启用mod_autoindex(即生成目录列表)时,当你请求没有斜杠的目录时,mod_autoindex将生成目录列表,尽管该目录中可能有一个DirectoryIndex
文档通常会阻止目录列表的生成。我还更新了您现有的规则,因为存在一些“漏洞”。我更新了我的答案,并提供了更多的解释。@White先生,++ve谢谢你的回答,谢谢你和我一起欢呼。