![Apache 对特定文件不缓存](https://linux22.com/image/518009/Apache%20%E5%AF%B9%E7%89%B9%E5%AE%9A%E6%96%87%E4%BB%B6%E4%B8%8D%E7%BC%93%E5%AD%98.png)
我有一个具有以下重写规则的应用程序:
RewriteCond /tmp/maintenance.html -f
RewriteCond %{HTTP_HOST} !^backdoor.myapp.com$
RewriteRule ^(.*)$ /tmp/maintenance.html [L]
这是我们的“维护模式”。因此我通过将 /tmp/maintenance.html 与真实文件链接来启用维护(并使用保留后门访问backdoor.myapp.com
)。
问题是,该页面似乎被浏览器缓存,因此当维护关闭时,用户必须进行硬刷新才能返回主应用程序。
我想知道如何在 Apache2 中设置此特定文件的标头。我相信有一个no-cache
标头?我假设我想为此文件设置该标头,一切都应该很好。
有人可以指导我如何做到这一点,或者解释一下这个静态文件永远不会被缓存在用户浏览器中的机制吗?
答案1
<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>
这应该适用于几乎所有的浏览器。
答案2
为了更好地控制从缓存中排除的文件的粒度,您可以使用“FilesMatch”指令。
另外,确保服务器上已加载 mod_headers 和 mod_rewrite。如果您不确定,请将 header 指令放在“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>