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

Dav*_*haw 11 apache tomcat

我们一直在尝试将我们的服务器配置为不缓存我们的.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>
Run Code Online (Sandbox Code Playgroud)

到我们的httd文件,但它似乎没有执行,但是,当我们移动文件管理器之外的标头集时,它似乎执行正常..

任何人都有任何想法我们出错了吗?

Joh*_*ell 14

我最近需要弄清楚同样的问题,虽然这篇文章指出了我正确的方向,但我想分享一些澄清信息,以便对将来搜索这个主题的人进行启发.

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

目录和文件的指示,用自己的正则表达式同行一起,应用指令到文件系统的部分.

这也是您使用LocationMatch的第二篇帖子解决了这个问题的原因.同样来自http://httpd.apache.org/docs/current/sections.html,它声明:

位置指令和其对应的正则表达式,而另一方面,改变在网络空间内容的设置.<SNIP>该指令不需要与文件系统有任何关系.例如,以下示例显示如何将特定URL映射到mod_status提供的内部Apache HTTP Server处理程序.文件系统中不需要存在称为服务器状态的文件.

<Location /server-status>
    SetHandler server-status
</Location>
Run Code Online (Sandbox Code Playgroud)

Apache的文档总结了下面的语句此行为:

使用"位置"将指令应用于文件系统之外的内容.对于存在于文件系统中的内容,请使用目录和文件.<Location />是一个例外,它是将配置应用于整个服务器的简便方法.


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

  • 位置指令基于HTTP请求URI匹配(例如,example / this/is/a/uri.htm,不带example.com部分).
  • 另一方面,Directory和Files指令根据DocumentRoot的文件系统中是否存在与HTTP请求URI的相应部分匹配的目录路径或文件进行匹配.

Apache的文档总结了这一行为:

什么用的时候

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

[重要!]在尝试限制对文件系统中对象的访问时,永远不要使用Location.这是因为许多不同的网站空间位置(URL)可以映射到相同的文件系统位置,从而可以规避您的限制.


Dav*_*haw 9

此问题现已解决.

为了使它工作,我们已经从使用FilesMatch改为LocationMatch现在,现在标题设置完美.

我们认为这是因为页面正在从JSP页面重定向到HTML页面.

<LocationMatch "\.(htm|html)$">
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"
</LocationMatch>
Run Code Online (Sandbox Code Playgroud)

希望其他人会觉得这很有帮助.