自定义标头不通过Dispatcher或影响缓存行为
通过Dispatcher提供页面时,自定义响应标头(如X-Robots-Tag、ETag和自定义缓存标头)消失;当存在旧版Vary: User-Agent指令时,这些标头会中断CDN缓存。 Dispatcher仅转发在其/cache/headers和/headers配置中明确列出的响应标头,并且Apache会覆盖某些标头(如ETag),除非通知他们推迟到AEM。 在场配置中允许标头,确保Apache转发它未经修改,删除旧版Vary: User-Agent指令,并清除缓存以恢复正确的标头传递和缓存。
描述 description
环境:
- Adobe Experience Manager as a Cloud Service (AEMaaCS)
- AEM Managed Services (AMS)
- Adobe Experience Manager内部部署软件
- AEM Dispatcher (Apache)和CDN层
问题/症状:
- 标头在具有
curl -I的AEM Publish中可见,但在Dispatcher中缺失。 - 由于
Vary: User-Agent,CDN不缓存页面。 - 由于Dispatcher绕过缓存,因此只有在添加查询参数(
?a=b)时才会显示自定义标头。 ETag已丢失或修改,例如Apache附加-gzip。- Dispatcher返回过时的内容,因为缓存的标头未刷新。
根本原因:
Dispatcher仅转发在/cache/headers和/headers中显式列出的响应标头。 当标头不存在时,Dispatcher会将其删除或使用缓存的标头元数据。 Apache将覆盖标头(如ETag),除非将其配置为延迟到AEM。 某些旧版vhost配置包括Header append Vary User-Agent,由于基数变化过大,因此中断了CDN缓存。 查询字符串请求绕过缓存,这使得缺少的标头仅出现在缓存的路径中。
如何确认
- 确定Dispatcher之前或之后是否缺少标头。 针对发布和Dispatcher URL运行
curl -I并比较标题集。 如果标头在Publish上出现,但在Dispatcher上缺失或修改,Dispatcher或Apache会将其删除。 如果Publish上已缺少该代码,请首先修复AEM代码。 - 检查是否涉及Dispatcher缓存。 使用查询参数(
curl -I针对带有?a=b的URL重新测试。) 如果标头仅与查询参数一起显示,则从缓存中提供资源,但不存储标头元数据。
解决方法 resolution
请按照以下步骤解决问题:
-
在场文件中允许缓存标头。 在发布场
.any文件中,将标头名称添加到/cache/headers块(例如:X-Robots-Tag、ETag或Edge-Cache-Tag)。 重新启动并清除缓存后,运行curl -I并确认标头是否显示。 -
确保Apache转发标头而不覆盖它。 对于AMS和内部部署,请编辑vhost:
- 对于
ETag,添加FileETag None和Header unset ETag。 - 对于自定义标头,请设置
SetEnvIfNoCase X-Robots-Tag "(.+)$" X_ROBOTS_TAG=$1和Header always set X-Robots-Tag "%{X-Robots-Tag}e" env=X_ROBOTS_TAG。
- 对于
运行apachectl -t,重新启动服务,并确认curl -I显示标头。
3. 在场文件中允许标头进行转发(而非缓存)。 将标头添加到/headers块,以便Dispatcher将其转发到客户端,即使未缓存响应也是如此,然后使用curl -I进行确认。
4. 删除旧版Vary: User-Agent指令。 搜索包含grep -R "Vary User-Agent" .的vhost目录并注释掉找到的任何实例,这样CDN就会恢复缓存响应。
5. 配置更改后清除缓存。 在AEMaaCS上,使用Cloud Manager → Environment →清除缓存。 在AMS或内部部署上,删除<dispatcher_cache_path>处的缓存文件或触发激活刷新,然后重新启动Apache。 确认curl -I显示正确的标头。
6. 验证域到场的映射。 确认vhost包含所请求的域,以便Dispatcher将正确的发布场与标头规则结合使用。 检查Dispatcher日志中是否有 没有场与主机 匹配;如果出现,请将域添加到vhost ServerName或ServerAlias中,然后重试。
验证
- 对Dispatcher URL运行
curl -I并确认标头存在且与Publish匹配。 - 确认已在Dispatcher缓存目录中创建缓存的元数据文件(
<path>.headers)。 - 确认vhosts中没有任何意外的标头(如
Vary: User-Agent),并检查更改前后的CDN缓存命中率。