我尝试将 mod_cache 放在我的应用服务器前面,以缓存“公共”请求,但不缓存来自登录用户的请求。出于各种原因,使用备用子域或路径对我来说不是一个可行的选择。我的基本设置如下:
# Expiry and cache-control
SetEnvIf Cookie "NOCACHE" no-cache
Header set Cache-Control "no-cache" env=no-cache
RequestHeader set X-FW-NoCache "on" env=no-cache
ExpiresActive On
ExpiresDefault "access plus 1 days"
#ExpiresByType text/html "now"
CacheEnable disk /
CacheRoot /var/cache/apache
CacheIgnoreHeaders Set-Cookie
#CacheIgnoreCacheControl on
#CacheIgnoreNoLastMod on
RewriteEngine On
# Search Engine Safe URL rewrite
# Redirect Coldfusion requests to index.cfm
# matches /file.mp4 but not /file:name.mp4 (ie; is a real file)
RewriteCond %{REQUEST_FILENAME} !/[^/:]+\.[^/:]{2,5}$
RewriteRule (.*) /index.cfm$1 [PT,L]
因此,如果 Apache 看到 NOCACHE cookie,它就会始终将请求传递给应用服务器,即使它在缓存中。它大部分情况下都能正常工作,但有一个问题让我有些苦恼。
如果您访问的页面没有 cookie,您将获得一个具有未来到期日期的缓存版本。如果您设置 cookie 并返回该页面,则不会发送请求,因为浏览器有自己的具有未来到期日期的缓存副本。
我该如何修改它,以便浏览器始终发出请求,并且缓存发送 304 或缓存副本,而无需要求应用服务器重新处理它?换句话说,我该如何告诉 mem_cache 缓存文件,而不是客户端和下游代理?
我尝试使用ExpiresByType text/html "now"
,但缓存根本不会缓存它 - 即使CacheIgnoreCacheControl
打开也是如此。
我也尝试过CacheIgnoreNoLastMod
但没有找到解决方案。
答案1
通常情况下,您只需设置即可完成此操作Expires = -1
,但在这种情况下,这会禁用缓存层。CacheIgnoreNoLastMod
出现只忽略 no-cache 和 no-store 标头而不忽略 Expires。我会尝试使用 no-cache 标头,如下所示:
Header merge Cache-Control no-cache env=CGI
使用 CacheIgnoreNoLastMod(参见mod_headers有关设置标题的更多详细信息)。w3 标头页面是了解 HTTP 标头的一个很好的资源。确保您特别了解缓存控制标头,因为这将帮助您了解系统正在做什么以及如何让它做您想要的事情。
为了调试,我会先禁用 mod_cache,然后使用 Chrome/Firefox 加载页面以检查 HTTP 标头,确保您获得所需的内容。确保在重新加载时强制重新加载页面(shift/ctrl 重新加载,我总是忘记哪一个)。