Nginx 使用 proxy_cookie_path 解决反向代理 cookie 丢失导致无法登录等问题

语法 参考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

其他相关:Nginx 反向代理及 Cookie 相关问题 - 简书 (jianshu.com)

你可能感兴趣的:(nginx,nginx)