为什么这个 FilesMatch 匹配不正确?

2024-05-27

我们一直在尝试将服务器配置为不缓存 .htm 文件,因为它会导致我们的分析包出现一些问题,并且如果访问者点击浏览器中的后退按钮,则无法正确显示页面。

我们尝试通过添加以下内容来解决这个问题:

<FilesMatch "\.(htm)$">
Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
Header set Pragma "no-cache"
Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
Header set Warning "Testing"
</FilesMatch>

到我们的 httd 文件,但它似乎没有执行,但是,当我们将标头集移到 FilesMatch 之外时,它似乎执行得很好。

有人知道我们哪里出了问题吗?


我最近需要解决同样的问题,尽管这篇文章为我指明了正确的方向,但我想分享一些澄清的信息,以启发那些将来搜索该主题的人。

David,您最初的 FilesMatch 无法正常工作,因为 FilesMatch 仅适用于文件系统上存在的真实物理文件。http://httpd.apache.org/docs/current/sections.html http://httpd.apache.org/docs/current/sections.html表述为:

The 目录和文件指令以及它们的正则表达式对应项,将指令应用于文件系统的某些部分.

这也是为什么您使用 LocationMatch 的第二篇文章解决了该问题。也来自http://httpd.apache.org/docs/current/sections.html http://httpd.apache.org/docs/current/sections.html, 它指出:

The 位置指令及其正则表达式对应项,另一方面,更改网络空间中内容的配置。 该指令不需要与文件系统有任何关系。例如,以下示例显示如何将特定 URL 映射到 mod_status 提供的内部 Apache HTTP Server 处理程序。文件系统中不需要存在名为 server-status 的文件。

<Location /server-status>
    SetHandler server-status
</Location>

The 阿帕奇文档 http://httpd.apache.org/docs/current/mod/core.html#location通过以下语句总结了此行为:

使用 Location 将指令应用于文件系统外部的内容。对于文件系统中的内容,请使用目录和文件。 是一个例外,这是一种简单的方法 将配置应用于整个服务器。


对于那些想要了解更多机制的人,这就是我对内部结构的理解:

  • 位置指令根据 HTTP 请求进行匹配URI https://stackoverflow.com/questions/176264/whats-the-difference-between-a-uri-and-a-url/1984225#1984225(例如 example.com/这个/is/a/uri.htm没有 example.com 部分)。
  • 另一方面,目录和文件指令根据文件系统中是否存在目录路径或文件进行匹配文档根目录 http://httpd.apache.org/docs/current/mod/core.html#documentroot与 HTTP 请求 URI 的相应部分相匹配

The 阿帕奇文档 http://httpd.apache.org/docs/current/sections.html将此行为总结为:

什么时候使用什么

在文件系统容器和网络空间容器之间进行选择实际上非常容易。当将指令应用于驻留在文件系统中的对象始终使用目录或文件。当将指令应用于不驻留在文件系统中的对象(例如从数据库生成的网页),使用 Location.

[重要!] 当尝试限制对文件系统中对象的访问时,切勿使用 Location,这一点很重要。这是因为许多不同的网络空间位置 (URL) 可以映射到相同的文件系统位置,从而允许您绕过限制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么这个 FilesMatch 匹配不正确? 的相关文章

随机推荐