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

三个应用间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的配置,是否在每个请求里都添加了Authorization token?如果是,而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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:28:49