nginx支持跨域cookie透传需同时满足:①access-control-allow-origin设为具体域名(不可用*);②access-control-allow-credentials:true且始终生效;③补充allow-methods/headers头;④options预检响应完整;⑤proxy_cookie_domain重写cookie域并确保samesite=none;secure;⑥前端请求启用credentials:include。

要让 Nginx 正确支持跨域 Cookie 透传,核心是配置 Access-Control-Allow-Credentials: true,但必须配合其他关键限制,否则浏览器会直接拒绝响应。
必须指定明确的 Origin,不能用 *
这是硬性要求:只要开启 Credentials,Access-Control-Allow-Origin 就绝不能设为 *。浏览器会主动拦截响应。
- 若只允许一个固定域名(如
https://app.example.com),直接写死:add_header 'Access-Control-Allow-Origin' 'https://app.example.com' always; - 若需支持多个域名(如
https://app.example.com和https://admin.example.com),推荐用map指令动态匹配:map $http_origin $cors_origin {<br> default "";<br> ~^https?://(app\.example\.com|admin\.example\.com)$ $http_origin;<br>}
然后在 server 或 location 块中:add_header 'Access-Control-Allow-Origin' $cors_origin always;
显式启用 Credentials 并确保预检与主请求都生效
Access-Control-Allow-Credentials: true 必须出现在所有相关响应中——包括 OPTIONS 预检请求和后续的实际请求(如 GET/POST)。
- 务必加
always标志,避免被某些模块覆盖:add_header 'Access-Control-Allow-Credentials' 'true' always; - 不要只在主 location 中设置,OPTIONS 请求也要返回该头;建议统一放在 server 或 upstream 外层,或通过 if 判断后补全
补充完整 CORS 响应头,避免预检失败
带凭证的跨域请求通常触发预检(OPTIONS),缺少任一必要头都会导致失败。
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always;add_header 'Access-Control-Allow-Headers' 'Content-Type, X-Requested-With, Authorization, DNT' always;- 对 OPTIONS 请求单独处理更稳妥:
if ($request_method = 'OPTIONS') {<br> add_header 'Access-Control-Max-Age' 1728000;<br> add_header 'Content-Type' 'text/plain charset=utf-8';<br> add_header 'Content-Length' 0;<br> return 204;<br>}
后端 Cookie 域名需与前端一致
Nginx 代理后,后端 Set-Cookie 的 Domain 若不匹配前端域名,浏览器会丢弃 Cookie。
- 例如后端设了
Domain=backend.com,而前端是https://app.example.com,需重写:proxy_cookie_domain ~\.?backend\.com$ app.example.com; - 同时确保后端 Cookie 设置了
SameSite=None; Secure(HTTPS 环境下必需) - 前端发起请求时也必须启用凭证:
credentials: 'include'(Axios)或withCredentials: true(fetch / XHR)











