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" }
验证方法
- 提交配置到AEM云服务,等待Dispatcher部署完成
- 分别用三个域名发起请求,通过浏览器Network面板检查:
Access-Control-Allow-Origin必须和当前请求的Origin完全一致- 响应头中存在
Vary: Origin - 不同域名的请求缓存Key不同,不会互相命中
内容的提问来源于stack exchange,提问作者SubSul
相关产品推荐
相关产品推荐

