强制 Apache 2.4 使用 mod_cache 缓存带有查询字符串的文件而不过期

强制 Apache 2.4 使用 mod_cache 缓存带有查询字符串的文件而不过期

我需要让 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

答案3

最明显的解决方案是在查询字符串到达​​之前将其删除mod_cache

最明显的模块就是mod_rewrite

但那不起作用,因为mod_cache开始故意使用2006 年查询字符串的未更改版本

相关内容