Apache 为什么文件匹配不正确?

Apache 为什么文件匹配不正确?,apache,tomcat,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,

我们一直试图将服务器配置为不缓存.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>

标题集缓存控制“最大年龄=0,无缓存,无存储,必须重新验证”
标题集Pragma“无缓存”
标题集过期“1984年1月11日星期三05:00:00 GMT”
标题集警告“测试”
但是,当我们将头集移到FilesMatch之外时,它似乎可以正常执行


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

这个问题现在已经解决了

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

标题集缓存控制“最大年龄=0,无缓存,无存储,必须重新验证”
标题集Pragma“无缓存”
标题集过期“1984年1月11日星期三05:00:00 GMT”
标题集警告“测试”

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

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

David,您的初始FileMatch不起作用,因为FileMatch只对文件系统中存在的真实物理文件起作用。声明如下:

目录和文件指令及其regex对应指令将指令应用于文件系统的部分

这也是您使用LocationMatch的第二篇帖子解决问题的原因。它还指出:

另一方面,Location指令及其对应的regex指令更改了Web空间中内容的配置SNIP>该指令不需要与文件系统有任何关系。例如,以下示例显示如何将特定URL映射到mod_status提供的内部Apache HTTP服务器处理程序。文件系统中不需要存在名为server status的文件


SetHandler服务器状态
使用以下语句总结此行为:

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


对于那些想了解更多力学的人,以下是我如何理解内部结构:

  • 位置指令根据HTTP请求匹配(例如,example.com/this/is/a/uri.htm,不带example.com部分)
  • 另一方面,目录和文件指令根据的文件系统中是否有和HTTP请求URI的相应部分匹配的目录路径或文件进行匹配
将此行为总结为:

什么时候使用 在文件系统容器和Web空间容器之间进行选择实际上相当容易。将指令应用于驻留在文件系统中的对象时,始终使用目录或文件。将指令应用于不在文件系统中的对象(例如从数据库生成的网页)时,请使用Location [重要!]在试图限制对文件系统中对象的访问时,切勿使用位置,这一点很重要。这是因为许多不同的Web空间位置(URL)可以映射到同一文件系统位置,从而可以绕过您的限制


非常感谢约翰和大卫。我在这方面花了很多时间,还有一个“细节”:如果您有一个Apache Web服务器并在其上使用“虚拟服务器”,当您编辑etc/apache2/sites available/your_server.conf尝试使用文件或文件匹配时,将不会发生任何事情。你必须使用位置。你是一个纯粹的英雄!
<Location /server-status>
    SetHandler server-status
</Location>