因此,我假设我的网站上有一个受Deny from all
我的.htaccess
文件保护的文件夹。我编写了一个异常,如下所示:
<files index.html>
order allow,deny
Allow from all
</files>
如果用户键入,www.example.com/path/index.html
他们能够正常查看网页。但是,如果他们采用更“用户友好”的方法并键入,www.example.com/path
则会收到403 Forbidden
错误消息。由于两条路径都访问同一个文件,我看不出一条路径如何工作而另一条路径却不行。目录中没有其他可能干扰的索引文件index.html
。有没有办法配置.htaccess
以允许第二条路径?任何解决方案都是可以接受的,包括超出范围的解决方案.htaccess
;是的,我有 PHP,不,我没有 AJAX。
答案1
当您仅指定裸目录时,mod_dir 会发出 DirectoryIndex 的内部子请求(我假设它已配置为index.html
在您的案例中提供服务)。“问题”在于该<Files>
指令首先被处理前子请求发生。但在此子请求发生之前,<Files>
指令匹配的文件名尚未解析;它是空的!因此,我们需要匹配一个空的文件名。
index.html
但是,一旦对(DirectoryIndex)的子请求发生,<Files>
容器就会被重新处理(在.htaccess
上下文中),但这一次文件名已解析为。所以,我们也index.html
需要匹配!index.html
这可以通过拥有两个容器来解决<Files>
。例如:
<Files "">
Order allow,deny
Allow from all
</Files>
<Files "index.html">
Order allow,deny
Allow from all
</Files>
或者(最好)将它们组合到单个<FilesMatch>
容器中(接受正则表达式作为参数)。例如:
<FilesMatch ^(index\.html)?$>
Order allow,deny
Allow from all
</Files>
通过创建文件名选修的(尾随?
)这有效地匹配了两个过程:一个空文件名和index.html
。
请注意,如果两个 URL/
和 /index.html
可用并提供相同的内容,则您应该以某种方式规范化 URL,以避免潜在的重复内容问题。(最好从 重定向/index.html
到/
。)
...然后输入
www.example.com/path
需要澄清的是,如果用户类型 www.example.com/path
,其中path
是文件系统目录,并且 URL 中省略了尾部斜杠,则 mod_dir 将(默认情况下)发出外部 301 重定向到www.example.com/path/
(带有尾部斜杠)以“修复”URL。因此,我们处理的 URL 实际上是www.example.com/path/
。
答案2
https://httpd.apache.org/docs/2.4/mod/mod_dir.html#directoryindex
“当客户端通过在目录名称末尾指定 / 来请求目录索引时,DirectoryIndex 指令会设置要查找的资源列表...”
# Example A: Set index.html as an index page, then add index.php to that list as well.
<Directory "/foo">
DirectoryIndex index.html
DirectoryIndex index.php
</Directory>
# Example B: This is identical to example A, except it's done with a single directive.
<Directory "/foo">
DirectoryIndex index.html index.php
</Directory>
# Example C: To replace the list, you must explicitly reset it first:
# In this example, only index.php will remain as an index resource.
<Directory "/foo">
DirectoryIndex index.html
DirectoryIndex disabled
DirectoryIndex index.php
</Directory>`