我需要让 mod_cache_disk 缓存包含查询字符串的站点。问题是它是 IIS 上的供应商产品,我们正尝试通过 mod_proxy 缓存它,并且它不包含 expires 标头。我意识到这个问题违反了几个 RFC,这就是为什么 apache 默认不这样做的原因。
有没有办法强制 apache 2.4.x 使用查询字符串进行缓存并且没有过期标头?
此配置将会缓存,但是当然不会尊重 - 它会缓存大多数项目的错误内容。
CacheEnable disk https://
CacheEnable disk /
CacheRoot /var/cache/mod_proxy/
CacheDirLevels 4
CacheDirLength 5
CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
CacheIgnoreHeaders None
CacheMaxFileSize 100000000
CacheMinFileSize 1
CacheMaxExpire 1209600
CacheDefaultExpire 3600
CacheIgnoreQueryString On
CacheStoreNoStore On
CacheStorePrivate On
如果我将 CacheIgnoreQueryString 更改为 Off,它将开始发出有关过期标头的错误。
AH00768:缓存:/view.image?Id=1114 未缓存。原因:查询字符串存在但没有明确的到期时间,
答案1
根据这个答案唯一的方法是让 Apache 看到它想要的标头(您所述的 Expires,以及显然还有 Last-Modified)。
该答案的发布者建议在应用程序端编写一个过滤器,但由于您的产品是供应商产品,因此可能不可行。 是否有机会直接在 IIS 中添加它? 否则,您可能会幸运地使用双代理设置:使用一个代理添加标头(但不添加缓存),然后使用代理那来自 Apache(获取标题和缓存)。
答案2
这就是我的解决方案
<IfModule mod_cache.c>
CacheIgnoreNoLastMod On
CacheIgnoreHeaders Set-Cookie
<IfModule mod_disk_cache.c>
CacheRoot D:\\apache_cache
CacheEnable disk /
CacheDirLevels 1
CacheDirLength 1
</IfModule>
</IfModule>
并从后端添加标题
Cache-Control:s-maxage=1200
s-maxage - 用于代理缓存和 CDN