Cookie共享的关键是确保前后端同域且Nginx正确透传与修正Cookie:后端Set-Cookie需设Domain=.example.com,Nginx中proxy_cookie_path / /api/修正路径,proxy_cookie_domain设为合法域名,并添加Secure、SameSite等安全标志。

前后端同域部署下,Cookie 共享的关键不是“跨域”,而是确保前端页面和后端接口在浏览器看来属于同一 domain + path 作用域,且 Nginx 不意外剥离或重写 Cookie。location 匹配本身不直接“实现”共享,但它决定了请求如何分发、Header 如何透传、Cookie 如何被修改或保留——这些才是共享能否成立的实操基础。
核心前提:必须同主域名(或显式设置 domain)
浏览器只在满足以下任一条件时自动携带 Cookie:
- 请求域名与 Cookie 的 Domain 属性完全一致(如
a.example.com请求携带Domain=a.example.com的 Cookie); - 请求域名是 Cookie Domain 的子域,且 Domain 设置为带前导点的主域(如
Domain=.example.com,则api.example.com和www.example.com都能携带); - 未设置 Domain,则默认绑定当前请求域名(最严格,也最易出错)。
所以第一步不是写 location,而是让后端返回的 Set-Cookie 显式带上 Domain=.example.com(Spring Boot 可配 server.servlet.session.cookie.domain=.example.com),或由 Nginx 在反向代理时统一注入。
location /api/ 中必须透传并修正 Cookie 路径
当 Nginx 把 /api/xxx 请求代理到后端 http://localhost:8080/xxx 时,后端可能返回 Set-Cookie: token=abc; Path=/。但浏览器看到的是 https://example.com/api/ 请求,而 Path=/ 表示该 Cookie 只在根路径生效,不会匹配 /api 下的请求——导致后续请求不带 Cookie。
解决方法是在 location /api/ 块中添加:
-
proxy_cookie_path / /api/;:把后端返回的Path=/改成Path=/api/,使 Cookie 仅对/api/*路径有效; -
proxy_cookie_domain off;或proxy_cookie_domain localhost:8080 example.com;:防止后端返回的Domain=localhost:8080被浏览器拒绝(无效域名),强制设为合法域名; -
proxy_pass_request_headers on;(默认开启)确保原始 Cookie 头传给后端; -
proxy_set_header Cookie $http_cookie;显式传递,避免某些场景丢失。
location / 中服务静态资源,不干扰 Cookie
前端 HTML、JS、CSS 由 Nginx 直接提供,访问路径如 https://example.com/ 或 https://example.com/login。只要这些页面的域名与 API 一致(都是 example.com),且页面中发起的 fetch/fetch API 请求路径以 /api/ 开头,浏览器就会自动携带已有的 Domain=.example.com; Path=/api/ Cookie。
注意:try_files $uri $uri/ /index.html; 不影响 Cookie,它只处理前端路由 fallback,与 Cookie 无关。
额外加固:确保 HTTPS 下 Cookie 安全属性兼容
若站点启用 HTTPS,后端或 Nginx 应确保 Cookie 带上 Secure 和 SameSite=Lax(或 None; Secure,需配合 CORS):
- Nginx 可用
proxy_cookie_flags ~ secure httponly samesite=lax;(1.19.3+)统一添加标志; - 避免后端返回
SameSite=Strict导致跨路径(如从/到/api/)不携带; - 不要在 HTTP 环境下设
Secure,否则 Cookie 不会被发送。


















