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

时间:2013-05-23 16:08:57

标签: 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>

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

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

2 个答案:

答案 0 :(得分:11)

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

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

  

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

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

  

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

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

Apache docs使用以下语句汇总​​了此行为:

  

使用“位置”将指令应用于文件系统之外的内容。对于存在于文件系统中的内容,请使用目录和文件。例外是&lt;位置/&gt;,这是一种简单的方法   将配置应用于整个服务器。


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

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

Apache docs将此行为概括为:

  

使用什么时

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

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

答案 1 :(得分:8)

此问题现已解决。

为了让它发挥作用,我们已经从使用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>

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