语法 参考nginx官方文档
语法: proxy_cookie_path off;
proxy_cookie_path path replacement;
默认: proxy_cookie_path off;
位置: http, server, location
该指令出现在 1.1.15 版中。
用于更改代理服务器响应头“Set-Cookie”值中的path文本。假设代理服务器返回带有属性“path=/two/some/uri/
”的“Set-Cookie”头字段,经过以下配置后
proxy_cookie_path /two/ /;
会将此属性重写为“path=/some/uri/
”。
使用原因
cookie 的 path 与地址栏上的 path 不一致
浏览器就不会接受这个 cookie,无法传入 JSESSIONID 的 cookie
导致登录验证失败。
解决方案
修改cookie的path值,使得path路径为当前url或者是当前url的父级。
假设cookie不共享的情况:
- A:假设地址栏url为: /a/b
- B:假设接口返回的“Set-Cookie”值中的path值:/c/d
解决方案列举:
- 更改B的值为/a/b,则可共享
- 更改B的值为/a, 则可共享
- 更改B的值为/, 则可共享
使用场景
当 nginx 配置的反向代理的路径和源地址路径不一致时使用
例如在前端代码异步调用后台接口的情况下,假设当前静态页面url为:http:www.xxx.com/shop/
, 异步调用后端接口返回的响应头字段Set-Cookies中的 Path为 Path:/background-api
, 可见/shop和/background-api不是从属关系,需要调整响应头中的Set-cookies 中的Path为:Path:/shop/background-api
,在nginx中可以通过设置proxy_cookie_path 的值来改变响应给客户端的Set-cookies 中的Path
使用 Demo
demo1:
重点看proxy_cookie_path
NGINX
# elastic-job 代理配置
location /etc-job/api/ {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://10.55.3.139:8088/api/;
proxy_cookie_path / /etc-job/api/;
proxy_set_header Cookie $http_cookie;
}
参考来源:
Nginx 使用 proxy_cookie_path 解决反向代理 cookie 丢失导致无法登录的问题
demo2:
路径也变化,则需要设置cookie的路径转换
location /proxy_path {
proxy_pass http://127.0.0.1:8080/project;
proxy_cookie_path /project /proxy_path;
}
总结一下paht取值的规则:
当cookie的path设置了值不为null的时候,以设置的值为准。
当cookie的path为null时候,获取请求的URI的path值
1). 当URI的path值是以“/”结尾的时候,直接设置为cookie的path值
2). 当URI的path值不是以“/”结尾的时候,查看path里面是否有“/”
(1). 如果有“/”的话,直接截取到最后一个“/”,然后设置为cookie的path值。
(2). 如果没有“/”的话,将cookie的path设置为”/”。
参考来源:
https://blog.csdn.net/m0_37564426/article/details/106438204