特定文件上的 Apache 无缓存

bra*_*rad 5 mod-rewrite mod-cache apache-2.2

我有一个具有以下重写规则的应用程序:

    RewriteCond /tmp/maintenance.html -f
    RewriteCond %{HTTP_HOST} !^backdoor.myapp.com$
    RewriteRule ^(.*)$ /tmp/maintenance.html [L] 
Run Code Online (Sandbox Code Playgroud)

这是我们的“维护模式”。所以我通过将 /tmp/maintenance.html 与真实文件链接来启用维护(并使用 保持后门访问backdoor.myapp.com)。

问题是,这个页面似乎被浏览器缓存了,所以当维护关闭时,用户必须进行硬刷新才能返回主应用程序。

我想知道如何仅在 Apache2 中设置此特定文件的标头。我相信有一个no-cache标题?我假设我想为这个文件设置那个标题,一切都应该很好。

有人可以指导我如何做到这一点,或者解释这个静态文件永远不应该缓存在用户浏览器中的机制吗?

小智 10

为了更好地控制从缓存中排除的文件的粒度,您可以使用“FilesMatch”指令。

另外,请确保 mod_headers 和 mod_rewrite 已加载到服务器上。如果您不确定,请将标头指令放在“ifModule”部分中:

<FilesMatch "^(excludeme-1|excludeme-2)\.jar$">
    FileEtag None
    <ifModule mod_headers.c>
        Header Unset ETag
        Header Set Cache-Control "max-age=0, no-store, no-cache, must-revalidate"
        Header Set Pragma "no-cache"
        Header Set Expires "Thu, 1 Jan 1970 00:00:00 GMT"
    </ifModule>
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)


小智 8

<Directory /some/real/path/to/tmp>
  Header Set Pragma "no-cache"
  Header Set Expires "Thu, 1 Jan 1970 00:00:00 GMT"
  Header Set Cache-Control "max-age=0, no-store, no-cache, must-revalidate"
  Header Unset ETag
  FileETag None
</Directory>
Run Code Online (Sandbox Code Playgroud)

这应该适用于几乎所有浏览器。