我最近需要解决同样的问题,尽管这篇文章为我指明了正确的方向,但我想分享一些澄清信息,以启发那些将来搜索该主题的人。
大卫,您最初的 FilesMatch 不起作用,因为 FilesMatch 仅适用于文件系统上存在的真实物理文件。http://httpd.apache.org/docs/current/sections.html将其声明为:
Directory 和 Files 指令以及它们的正则表达式对应项,将指令应用于文件系统的某些部分。
这也是您使用 LocationMatch 的第二个帖子解决问题的原因。同样来自http://httpd.apache.org/docs/current/sections.html,它指出:
另一方面,Location 指令及其正则表达式对应项更改了 webspace 中内容的配置。< SNIP > 该指令不需要与文件系统有任何关系。例如,以下示例显示如何将特定 URL 映射到 mod_status 提供的内部 Apache HTTP Server 处理程序。文件系统中不需要存在名为 server-status 的文件。
<Location /server-status>
SetHandler server-status
</Location>
Apache 文档用以下语句总结了这种行为:
使用 Location 将指令应用于文件系统之外的内容。对于文件系统中的内容,请使用目录和文件。< Location /> 是一个例外,这是一种将配置应用于整个服务器的简单方法。
对于那些想了解更多机制的人,这就是我理解内部的方式:
- 位置指令匹配基于 HTTP 请求URI(例如 example.com/this/is/a/uri.htm没有example.com 部分)。
- 另一方面,Directory 和 Files 指令根据 DocumentRoot 的文件系统中是否存在与 HTTP 请求 URI 的相应部分匹配的目录路径或文件进行匹配
Apache 文档将这种行为总结为:
什么时候用
在文件系统容器和网络空间容器之间进行选择实际上非常容易。将指令应用于驻留在文件系统中的对象时,始终使用 Directory 或 Files。将指令应用于不驻留在文件系统中的对象(例如从数据库生成的网页)时,请使用 Location。
[重要!] 在尝试限制对文件系统中对象的访问时,切勿使用 Location 非常重要。这是因为许多不同的网站空间位置 (URL) 可以映射到相同的文件系统位置,从而可以规避您的限制。