htaccess - 允许通过 www.example.com/foo 而不是 www.example.com/foo/index.html 查看 index.html

htaccess - 允许通过 www.example.com/foo 而不是 www.example.com/foo/index.html 查看 index.html

因此,我假设我的网站上有一个受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>`

相关内容