问题描述
我已经在我的 AEM 服务器上配置了 ETags(使用 ACS Commons ETag 支持)并在 Apache 上禁用了 ETag。但是一旦文件被缓存在 dispatcher 上,Apache 总是返回 200 和响应正文而不是 304 Not modified。我已验证存储在“.h”文件和响应中的 ETag 值与请求的“if-none-match”标头的值相同。 如果我从调度程序中删除缓存文件并重新发送请求,则 AEM 会正确返回 304。
我还禁用了 mod_deflate,因为我在某些地方发现 deflate 的“-gzip”后缀可能会导致 ETag 匹配问题。
此外,我尝试使用 Last-Modified 和 If-Modified-Since 标头,而不是 ETag。但也没有运气。我注意到,在大多数情况下,我们通常都有 Last-Modified 标头,而我从未见过 304。因此,这似乎不是特定于版本的问题。我找不到任何与此相关的配置文档。有人可以指导我哪里出错了吗?
解决方法
检查这个https://issues.apache.org/bugzilla/show_bug.cgi?id=45023
我已启用放气
RequestHeader edit "If-None-Match" "^\"(.*)-gzip\"$" "\"$1\""
Header edit "ETag" "^\"(.*[^g][^z][^i][^p])\"$" "\"$1-gzip\""
,
我们不使用 Etags,因为很难跨集群同步它们,而且 Last Modified 工作正常。
# turn off Etags completely,since they will differ across the cluster
FileETag None
# FileETag None is not enough for every server.
Header unset ETag
# instead we use Expires and Cache-Control headers
ExpiresActive On
# set Expires default to 15 minutes,so browser caches for a visit
ExpiresDefault "access plus 15 minutes"
# but a maybe few types are exempt from this
ExpiresByType text/cache-manifest "access plus 0 seconds"
ExpiresByType text/html "access plus 0 seconds"
ExpiresByType text/xml "access plus 0 seconds"
ExpiresByType application/xml "access plus 0 seconds"
ExpiresByType application/json "access plus 0 seconds"
# set CacheControl public header
# so content is cached in Firefox,even over https
# "public" keyword MUST be the first value in the header,or it will not work in FF
Header onsuccess edit Cache-Control "^(.*)$" "public,$1"
您可以相应地调整超时时间,具体取决于您的内容。