12

我们一直在尝试将我们的服务器配置为不缓存我们的 .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 集移到 FilesMatch 之外时,它似乎执行得很好。

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

4

2 回答 2

18

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

大卫,您最初的 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) 可以映射到相同的文件系统位置,从而可以规避您的限制。

于 2014-09-29T16:14:35.893 回答
10

现在这个问题已经解决了。

为了让它工作,我们已经从使用更改FilesMatchLocationMatch,现在标题设置得很好。

我们认为这是因为页面正在从 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>

希望其他人会发现这很有帮助。

于 2013-05-24T12:48:26.700 回答