.htaccess删除文件扩展名与同名文件夹冲突

.htaccess删除文件扩展名与同名文件夹冲突,.htaccess,.htaccess,我正在使用.htaccess文件从url中删除文件扩展名(如.html)。文件中的代码工作正常,但只要存在与文件同名但没有扩展名的文件夹,它就会重定向到该文件夹,而不是重定向到该文件。例如,如果我在同一目录中有一个demo.html文件和一个demo文件夹,只要我在浏览器的搜索栏中键入www.example.com/demo,它就会重定向到该文件夹,而不是该文件。如果我删除文件夹并再次键入相同的内容,它将非常有效!任何帮助都将不胜感激:) 以下是.htaccess文件中的代码: RewriteC

我正在使用.htaccess文件从url中删除文件扩展名(如.html)。文件中的代码工作正常,但只要存在与文件同名但没有扩展名的文件夹,它就会重定向到该文件夹,而不是重定向到该文件。例如,如果我在同一目录中有一个
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谢谢你的回答,谢谢你和我一起欢呼。