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

Posted

技术标签:

【中文标题】AEM Dispatcher (4.3.3) 总是返回 200 而不是 304 (Apache 2.4.6)【英文标题】:AEM Dispatcher (4.3.3) always returning 200 instead of 304 (Apache 2.4.6) 【发布时间】:2021-06-18 10:22:15 【问题描述】:

我在我的 AEM 服务器上配置了 ETag(使用 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。因此,这似乎不是特定于版本的问题。我找不到与此相关的任何配置文档。有人可以指导我哪里出错了吗?

【问题讨论】:

【参考方案1】:

查看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\""

【讨论】:

正如我所说,我已经完全禁用了 mod_deflate。所以,这不应该是相关的。此外,在 Apache 的错误列表之一中,我发现 ETag 也存在一些问题。所以,我尝试使用 Last-Modified。但也没有运气。【参考方案2】:

我们不使用 Etag,因为很难在集群中同步它们,而且 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"

您可以根据您的内容相应地调整超时时间。

【讨论】:

不知何故 Last-Modified 属性没有在我们的集群上同步。不同的发布者对同一节点有不同的 jcr:lastModified 值,因此我们无法使用它。 您查看experienceleague.adobe.com/docs/experience-manager-dispatcher/… 中的说明了吗?也许分享你的那部分配置? 是的。我检查了一下,Last-Modified 标头被缓存在调度程序的标头文件中,并且我确保该值来自 AEM。以下是我当前使用的配置: /headers "Cache-Control" "Content-Disposition" "Content-Type" "Expires" "Last-Modified" "X-Content-Type-Options"

以上是关于AEM Dispatcher (4.3.3) 总是返回 200 而不是 304 (Apache 2.4.6)的主要内容,如果未能解决你的问题,请参考以下文章

具有 Windows 身份验证 NTLM 的 IIS 10 上的 AEM Dispatcher - 启用 Dispatcher 缓存时的身份验证问题

配置 AEM CQ6 (author + publish + apache dispatcher + ubuntu )

如何使用JAX-RS和Jersey在Adobe AEM 6.2中发布json数据

Flux 抛出 Dispatcher 不是构造函数

sh AEM 6. + - 用于终止AEM java进程的kill命令。

sh AEM 6. + - 用于终止AEM java进程的kill命令。