AEM Dispatcher (4.3.3) 总是返回 200 而不是 304 (Apache 2.4.6)

问题描述

我已经在我的 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"

您可以相应地调整超时时间,具体取决于您的内容。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...