关键在于用 Nginx 的 proxy_cookie_path 按 location 动态重写 Cookie Path,实现路径级隔离;配合 proxy_redirect、rewrite 和 X-Forwarded-Prefix 确保跳转与资源路径一致。

要让多个子应用(比如 /shop/、/user/、/admin/)共享同一域名但互不干扰 Cookie,关键不是靠后端改逻辑,而是用 proxy_cookie_path 在 Nginx 层按访问路径动态限定每个子应用的 Cookie 作用域。
为什么需要动态隔离
浏览器只在请求 URL 路径以 Cookie 的 Path 值为前缀时才发送它。如果所有子应用都用 Path=/,那么访问 /shop/ 时浏览器会把 /user/ 的 Cookie 也发过去——可能触发权限误判或状态污染。而硬编码后端设不同 Path 又缺乏灵活性。Nginx 的 proxy_cookie_path 可在代理出口处统一收口,实现“谁进谁的门,谁带谁的钥匙”。
按 location 分别配置基础路径映射
每个子应用对应独立 location 块,proxy_cookie_path 写在 proxy_pass 后面,确保只影响该路径下的响应:
-
location /shop/ { proxy_pass http://shop_backend/; proxy_cookie_path / /shop/; }→ 把后端返回的Path=/改成Path=/shop/ -
location /user/ { proxy_pass http://user_backend/; proxy_cookie_path / /user/; }→ 同理,隔离到/user/ location /admin/ { proxy_pass http://admin_backend/; proxy_cookie_path / /admin/; }
处理后端自带非根路径的 Cookie
有些子应用自身部署在子路径下(如后端返回 Path=/api/v1/),但你希望它在前端暴露为 /shop/api/。这时不能简单全替成 /shop/,否则 API 路径错乱:
- 后端返回
Path=/api/v1/,前端访问路径是/shop/→ 配置:proxy_cookie_path /api/v1/ /shop/api/v1/; - 若后端还同时返回
Path=/(如主页面 Cookie),可叠加一条:proxy_cookie_path / /shop/;(Nginx 会按顺序匹配,优先用更具体的)
用正则支持路径结构变化
当子应用版本升级或路径含变量(如 /v2/product、/v3/order),可用正则提取并重写,避免每版都改配置:
- 统一将所有
/v\d+/开头的原始 Path 替换为/shop/下对应结构:proxy_cookie_path ~^/v(\d+)/(.*)$ /shop/v$1/$2; - 把后端写的
Path=/project/user/abc123动态转成/user/abc123:proxy_cookie_path ~^/project/(.*)$ /$1;
必须同步处理跳转与资源路径
只改 Cookie Path 不够。后端返回的 Location: /dashboard 或 JS 中拼的 /api/login 仍指向原始路径,会导致二次请求因路径不匹配而丢失 Cookie:
- 用
proxy_redirect / /shop/;重写响应头中的跳转地址 - 用
rewrite ^/shop/(.*)$ /$1 break;把客户端请求还原给后端(配合proxy_pass http://backend;不带尾斜杠) - 加
proxy_set_header X-Forwarded-Prefix /shop/;,方便后端生成正确链接











