三个应用间CORS配置不一致问题排查求助
排查CORS错误的思路
首先,咱们先聚焦错误提示本身:missing token 'authorization' in CORS header 'Access-Control-Allow-Headers'——这说明浏览器发送的预请求(OPTIONS)里包含了Authorization头,但Matomo服务器返回的响应里,Access-Control-Allow-Headers列表并没有包含这个头,所以浏览器拦截了后续请求。而Portal能正常工作,大概率是它的请求里没带这个头,或者Matomo对它的请求返回了正确的头配置。下面是具体排查步骤:
1. 对比两个应用的请求细节
用浏览器开发者工具(FireFox的网络面板)分别抓Portal和内容创建站点向Matomo发送的请求,重点看:
- 正式请求(比如POST/GET)是否携带
Authorization头:内容创建站点的请求很可能因为AngularJS的全局配置(比如HTTP拦截器)自动添加了这个头,而Portal的请求没有。 - 预请求(OPTIONS)的响应头:检查Matomo返回的
Access-Control-Allow-Headers字段,确认是否包含Authorization。如果Portal的OPTIONS响应里有这个值,而内容创建站点的没有,那可能是Matomo的CORS配置对不同来源做了区分。
2. 检查Matomo服务器的CORS配置
Matomo基于PHP/Apache,主要看这两处:
- Apache的.htaccess文件(Matomo根目录下):确认是否配置了正确的CORS头。比如是否明确列出了
Authorization在Access-Control-Allow-Headers里?示例配置:# 允许指定子域名的跨域请求 SetEnvIf Origin "^https://(content-creator\.mydomain\.com|portal\.mydomain\.com)$" ALLOWED_ORIGIN=$0 Header set Access-Control-Allow-Origin "%{ALLOWED_ORIGIN}e" env=ALLOWED_ORIGIN Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" # 必须包含Authorization,匹配你的请求头 Header set Access-Control-Allow-Headers "Authorization, Content-Type, X-Requested-With" Header set Access-Control-Allow-Credentials "true" # 处理OPTIONS预请求,直接返回200 RewriteEngine On RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L] - Matomo自身的CORS设置:有些Matomo插件或者配置文件可能会覆盖Apache的头设置,检查Matomo的
config/config.ini.php里是否有相关CORS配置项。
3. 排查CloudFlare的影响
所有应用都在CloudFlare后面,可能CloudFlare的规则修改了CORS响应头:
- 检查Page Rules:是否有针对Matomo域名(analytics.mydomain.com)的规则,修改了
Access-Control-*头?比如是否只给Portal的来源添加了正确的头? - 检查Workers:如果有Workers处理Matomo的请求,确认是否正确传递或设置了CORS头。
- 确认CloudFlare的SSL模式:确保所有站点都用的是严格SSL模式,避免因SSL层级问题导致头传递异常。
4. 检查内容创建站点的AngularJS配置
内容创建站点是Node.js+AngularJS,看看是否有全局HTTP拦截器自动添加了Authorization头:
- 查找代码中类似
$httpProvider.interceptors.push的配置,是否在每个请求里都添加了Authorizationtoken?如果是,而Matomo不需要这个头,可以修改拦截器,排除Matomo的请求路径;或者让Matomo的CORS配置允许这个头。 - 临时注释掉拦截器,测试向Matomo的请求是否正常,以此验证是否是这个头导致的问题。
5. 验证预请求的响应一致性
用curl手动发送OPTIONS请求模拟内容创建站点的来源,看Matomo返回的头:
curl -X OPTIONS https://analytics.mydomain.com/matomo-endpoint \ -H "Origin: https://content-creator.mydomain.com" \ -H "Access-Control-Request-Method: POST" \ -H "Access-Control-Request-Headers: Authorization"
查看返回的响应头,如果Access-Control-Allow-Headers里没有Authorization,那就是Matomo的配置问题,需要调整;如果有,那可能是CloudFlare或者浏览器缓存的问题,尝试清空浏览器缓存或者禁用CloudFlare的缓存测试。
内容的提问来源于stack exchange,提问作者Jolly
相关产品推荐
相关产品推荐

