我在 Apache 中让 mod_disk_cache 运行良好。它缓存了来自 Tomcat 的一些请求。但由于各种原因(我不会深入讨论),我们无法让 Tomcat 删除其他内容的 Expires 和 Cache-Control 标头。这些标头设置为 no-cache 和 0。我需要修改或删除它们,因为如果设置了这些标头,Apache 的 mod_cache 将不会缓存内容。
我的想法是设置 Apache 以剥离标头,然后转发到 mod_cache。或者,如果有办法告诉 mod_cache 忽略缓存控制标头,那也可以。
两个 Apache 实例就可以了。我宁愿只使用两个虚拟主机,并让一个代理代理另一个。也许我可以用一个 VH 来实现。配置会是什么样子?
以下方法不起作用。它会删除传递给客户端的标头,但 ajp 代理的资源不会缓存到磁盘。我认为它首先评估 mod_cache,看到 nocache 标头,拒绝缓存,然后执行标头删除。
Header unset Expires
Header unset Cache-Control
LoadModule cache_module modules/mod_cache.so
<IfModule mod_cache.c>
LoadModule cache_disk_module modules/mod_cache_disk.so
<IfModule mod_cache_disk.c>
CacheRoot "/www/cache"
CacheEnable disk "/"
CacheDirLevels 5
CacheDirLength 3
</IfModule>
</IfModule>
ProxyPass "/myappdir" "ajp://localhost:8009/myappdir"
答案1
查看 Tomcat servlethttps://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/filters/ExpiresFilter.html. 它适用于你们两种情况。
另外,Mod_cache 有一个忽略标题选项。
答案2
我搞明白了。下面介绍如何通过 mod_proxy 将虚拟主机链接在一起,并让第一个虚拟主机删除标头,然后转发到第二个虚拟主机,后者执行磁盘缓存。
<VirtualHost *:80>
CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
CacheHeader on
CacheRoot "/var/www/cache"
CacheEnable disk "/"
CacheDirLevels 5
CacheDirLength 3
ProxyPass "/" "http://localhost:81/"
ProxyPassReverse "/" "http://localhost:81/"
</VirtualHost>
<VirtualHost *:81>
Header unset Expires
Header unset Cache-Control
ProxyPass "/mytomcatapp" "ajp://localhost:8009/mytomcatapp"
</VirtualHost>