基于cookie的Apachecaching

我试图把mod_cache放在我的应用程序服务器前,以caching“公共”请求,但不是来自login用户的请求。 由于种种原因,使用替代子域或path对我来说不是一个可行的select。 我的基本设置为:

# 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,它总会将请求传递给应用程序服务器,即使它存在caching中。 它主要是工作,但有一个问题,导致我一些悲伤。

如果您在没有cookie的情况下访问该页面,则会得到一个有未来失效date的caching版本。 如果您然后设置cookie并返回到该页面,则不会发送请求,因为浏览器具有自己的带有将来到期date的caching副本。

我该如何修改它,以便浏览器始终发出请求,并且caching发送304或caching副本而不要求应用程序服务器重新处理它? 换句话说,我该如何告诉mem_cachecaching文件,而不是客户端和下游代理?

我尝试使用ExpiresByType text/html "now"但然后caching不会caching它的所有 – 即使CacheIgnoreCacheControl打开。

我也玩过CacheIgnoreNoLastMod但没有任何运气find解决scheme。

通常你只要设置Expires = -1就可以做到这一点,但是在这种情况下,这会禁用caching层。 CacheIgnoreNoLastMod 似乎只忽略no-cache和no-store标题而不是Expires。 我会尝试使用no-cache标头,如:

Header merge Cache-Control no-cache env=CGI

与CacheIgnoreNoLastMod(请参阅mod_headers关于设置标题的更多细节)。 w3 Headers页面是理解HTTP头文件的好资源。 请确保您了解caching控制标头,因为这将帮助您了解系统正在执行的操作,以及如何使其执行您所需的操作。

出于debugging目的,我会先禁用mod_cache,然后使用Chrome / Firefox加载页面来检查HTTP标头,以确保获得您所需的内容。 确保在重新加载的时候强制页面重新加载(shift / ctrl重新加载,我总是忘记哪一个)。