Token必须显式写入Access-Control-Allow-Headers,因为浏览器对含自定义头的跨域请求会发起OPTIONS预检,而预检响应中该头不支持通配符,需白名单声明。

在 Nginx 中配置 Access-Control-Allow-Headers 时,如果前端需要携带自定义请求头(如 Token、X-Auth-Token 或 Authorization),必须显式将其列入该响应头中,否则浏览器会因 CORS 预检失败而拦截请求。
为什么 Token 必须显式写入 Access-Control-Allow-Headers
浏览器发起跨域请求时,若请求包含非简单头(如 Token、Content-Type: application/json 以外的值、或任何自定义头),会先发送一个 OPTIONS 预检请求。服务器必须在预检响应中通过 Access-Control-Allow-Headers 明确声明允许哪些请求头,否则浏览器直接拒绝后续实际请求。
注意:Access-Control-Allow-Headers: * 在预检响应中**不被允许**用于包含自定义头的场景(除非请求不含凭据且服务端明确支持通配符,但多数浏览器仍限制)。所以 Token 这类头必须白名单式列出。
Nginx 中正确配置 Token 头的写法
在对应 server 或 location 块中添加如下响应头配置:
# 允许跨域请求来源(按需调整)
add_header 'Access-Control-Allow-Origin' 'https://www.php.cn/link/ab3e363159c8a7f02c774f0d6bc7c922' always;
# 显式声明允许的请求头,包含 Token
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Token,Authorization' always;
# 允许携带 Cookie 或认证信息(如需)
add_header 'Access-Control-Allow-Credentials' 'true' always;
# 允许的 HTTP 方法
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH' always;
# 预检结果缓存时间(秒)
add_header 'Access-Control-Max-Age' 1728000 always;
<h1>处理预检请求直接返回 204</h1><p>if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '<a href="https://www.php.cn/link/ab3e363159c8a7f02c774f0d6bc7c922">https://www.php.cn/link/ab3e363159c8a7f02c774f0d6bc7c922</a>';
add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Token,Authorization';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT,DELETE,PATCH';
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 204;
}</p>常见踩坑点与验证方法
-
大小写敏感:Header 名是大小写不敏感的,但建议统一用首字母大写格式(如
Token)保持可读性;Nginx 配置中写成token也能生效,但易引发协作误解。 -
多个 Token 变体都要列全:比如前端用的是
X-Token或Bearer-Token,就必须对应写进Access-Control-Allow-Headers,不能只写Token。 -
OPTIONS 响应必须包含所有 CORS 头:仅在非 OPTIONS 请求里加 header 不够,预检响应缺失任一 required header(如
Allow-Origin或Allow-Headers)都会导致失败。 -
验证方式:用浏览器开发者工具 → Network → 点击 OPTIONS 请求 → 查看 Response Headers 是否含完整、拼写正确的
Access-Control-Allow-Headers字段,并确认其值包含Token。
补充说明:Token 和 Authorization 的取舍
如果后端统一使用 Authorization: Bearer xxx 方式传令牌,建议优先用 Authorization 而非自定义 Token 头。因为:
-
Authorization是标准头,部分 Nginx + proxy 场景下更稳定; - 多数现代框架(如 Express、Spring Security)对
Authorization有原生支持; - 仍需在
Access-Control-Allow-Headers中显式声明Authorization,不可省略。

















