在 Apache 代理中缓存查询字符串

在 Apache 代理中缓存查询字符串

我在让 disk_cache 工作时遇到了问题,但我不知道原因。这是我的配置中的相关部分

# Caching
CacheRoot   "/var/cache/apache2/"
CacheEnable disk /

我正在对如下请求进行计时,但缓存似乎没有生效,因为无论如何响应都用了 7 秒。

time curl -k https://customer1.myhosts.com/appserver/slow_request?param1=fooBar

启用调试日志记录后,我在日志中发现以下语句,解释了为什么没有进行缓存:

[2012 年 8 月 24 日星期五 17:22:01] [调试] mod_cache.c(552): 缓存:未缓存。原因:查询字符串存在,但没有明确的到期时间

事实证明,Apache 缓存指南中提到了这一点:

如果 URL 包含查询字符串(例如来自 HTML 表单 GET 方法),则不会缓存,除非响应通过包含“Expires:”标头或“Cache-Control:”标头的 max-age 或 s-maxage 指令指定明确的到期时间,如 RFC2616 第 13.9 和 13.2.1 节所述。

好的,所以我添加以下内容(取自本文)在 Apache 中

Header set Cache-Control "max-age=290304000"

它仍然不起作用,这次我收到了消息

“...未缓存。原因:没有 Last-Modified、Etag 或 Expires 标头”

现在,这是一个不同的故事。如何在不触及应用服务器代码的情况下解决这个问题?

答案1

我让 Apache 缓存来自应用服务器的响应的唯一方法是将 Apache 在日志中请求的标头实际添加到响应中。事实证明,通过创建 JAX-RS 过滤器,这相当容易。

因此,在添加 Last-Modified 和 Expires 标头后,唯一需要的就是我的 apache 配置中的以下两行。

CacheRoot   "/var/cache/apache2/"
CacheEnable disk / 

答案2

如同

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

Cache-Control:s-maxage=1200 

解决了这个问题

相关内容