You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AEM云服务多域名CORS缓存问题求助:Dispatcher配置调试困境

解决AEM Cloud Service中Dispatcher多域名CORS缓存冲突问题

问题本质

Dispatcher默认会缓存带有Access-Control-Allow-Origin的响应,而这个头的值与请求的Origin强绑定。当第一个域名的请求触发缓存后,后续其他域名的请求会拿到缓存的响应,此时响应中的Allow-Origin与当前请求的Origin不匹配,直接触发CORS错误——哪怕这些域名都在你的允许列表里。

分步解决方案

1. 禁止缓存CORS响应头

编辑dispatcher.d/cache/headers,明确排除所有CORS相关头,避免它们被缓存:

/headers
{
    # 保留业务需要缓存的头,示例如下
    "Cache-Control"
    "Content-Type"
    "Last-Modified"
    # 排除CORS专属头
    !"Access-Control-Allow-Origin"
    !"Access-Control-Allow-Methods"
    !"Access-Control-Allow-Headers"
    !"Access-Control-Expose-Headers"
}

2. 配置Vary: Origin实现分Origin缓存

在你的vhost配置文件(比如/conf.d/available_vhosts/wknd.vhost)中,给API路径添加Vary: Origin头,让Dispatcher根据不同的Origin生成独立缓存:

<Location /content/dam>
    # 针对内容片段模型API路径设置
    Header always set Vary "Origin"
</Location>

同时确保dispatcher.d/cache/headers中包含"Vary"(不要排除它),这样Dispatcher才会尊重这个头的缓存策略。

3. 修正OSGI CORSPolicyImpl配置

检查com.adobe.granite.cors.impl.CORSPolicyImpl的配置:

  • allowedOrigins必须明确列出所有三个域名:["https://domain1.com", "https://domain2.com", "https://domain3.com"](注意要带协议)
  • path要覆盖内容片段模型API的路径,比如/content/dam/*或/api/assets/*
  • 如果前端需要带Cookie,将allowCredentials设为true

4. 确保ClientHeaders传递CORS请求头

确认conf/dispatcher.d/clientheaders中包含所有CORS请求头,保证Dispatcher能把这些头转发给AEM:

Origin
Access-Control-Request-Method
Access-Control-Request-Headers

5. 禁止缓存OPTIONS预检请求

预检请求(OPTIONS方法)绝对不能被缓存,在dispatcher.d/cache/rules中添加规则:

/0001 { /type "deny" /method "OPTIONS" }

验证方法

  1. 提交配置到AEM云服务,等待Dispatcher部署完成
  2. 分别用三个域名发起请求,通过浏览器Network面板检查:
    • Access-Control-Allow-Origin必须和当前请求的Origin完全一致
    • 响应头中存在Vary: Origin
    • 不同域名的请求缓存Key不同,不会互相命中

内容的提问来源于stack exchange,提问作者SubSul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:00:05