必须启用 Apache 的 mod_headers 模块并同步配置 Timing-Allow-Origin 与 Access-Control-Allow-Origin(值严格一致),且确保 OPTIONS 预检通过,否则 Performance API 无法获取 connectStart 等详细耗时字段。

Timing-Allow-Origin 不是 Apache 默认支持的响应头,XAMPP 本身也不提供开箱即用的 Timing API 跨域支持;必须手动启用 mod_headers 并显式设置该头,否则浏览器始终收不到它,performance.getEntriesByType('resource') 就无法拿到真实耗时数据。
为什么加了 Timing-Allow-Origin 还没效果
常见现象:前端调用 fetch() 后在 Performance API 中查不到 DNS/TCP/SSL 等详细时间,entry.duration 正常但 entry.connectStart 等字段全是 0 —— 这不是代码问题,而是服务端根本没返回 Timing-Allow-Origin 响应头。
- Apache 默认不发送这个头,即使你已配好
Access-Control-Allow-Origin - 没启用
mod_headers模块时,Header set指令完全被忽略(不会报错,静默失效) -
Timing-Allow-Origin必须和Access-Control-Allow-Origin值一致,不能一个写*、一个写具体域名 - 如果前端请求带
credentials: true,Timing-Allow-Origin也不能用*,必须写明确域名
必须先启用 mod_headers 才能设 Timing-Allow-Origin
这步漏掉,后面所有配置都白搭。打开 XAMPP\apache\conf\httpd.conf,搜索:
LoadModule headers_module modules/mod_headers.so
删掉行首的 # 取消注释。确认没有拼写错误(比如写成 header_module 少了个 s),保存后重启 Apache。
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 验证是否生效:执行
httpd -M | findstr headers,输出含headers_module (shared)表示加载成功 - 若重启失败,检查错误日志:
XAMPP\apache\logs\error.log,常见原因是路径错或模块文件缺失 - 不要试图用
.htaccess加这个头——XAMPP 默认禁用Header指令覆盖,会直接 500
在 <Directory> 或虚拟主机中同时设置两个 CORS 头
不能只加 Access-Control-Allow-Origin,Timing-Allow-Origin 必须同步配置。例如开发环境允许任意源:
<Directory "C:/xampp/htdocs/myapp">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
Header set Access-Control-Allow-Origin "*"
Header set Timing-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, X-Requested-With"
</Directory>
- 生产环境必须把
*换成具体域名,如https://myapp.com,且两个头值严格一致 - 如果前端发的是带凭证的请求(
credentials: true),两个头都不能用*,且必须额外加Header set Access-Control-Allow-Credentials "true" -
Timing-Allow-Origin只影响 Performance API 的字段可见性,不影响请求是否成功,别把它和功能型 CORS 头混淆
OPTIONS 预检请求必须能通过,否则 Timing 头压根不会发
浏览器对非简单请求(如带自定义 header 或 Content-Type: application/json)会先发 OPTIONS。如果 Apache 返回 405,整个请求链就断了,Timing-Allow-Origin 根本没机会发出。
- 确保虚拟主机或目录配置里有
Require all granted,否则 Apache 默认拒绝OPTIONS - 检查有没有其他重写规则(如
RewriteRule)把OPTIONS重定向或拦截了 - 临时加一行测试:
Header always set X-Debug "options-passed",用 curl 发OPTIONS请求看响应头是否出现
Timing API 的跨域支持是个“全有或全无”的链条:mod_headers 加载 → Timing-Allow-Origin 正确设置 → OPTIONS 可达 → 前端请求匹配该头值。任一环节断开,Performance 数据就只剩 duration。

















