Nginx 中 proxy_cookie_path 的用法

        昨天调试 nginx 的时候, 转发都配置好了, 结果登录之后又跳到了登录页面, 顿时一脸懵逼;然后在别的地方看了下配置, 拷贝过来之后就可以正常登录的. 而拷贝过来的配置的一个关键的指令就是 proxy_cookie_path, 这不禁引起了我的好奇, 遂撰此文记录, 避免下次踩坑.

        下面的这个介绍部分参考了这个博客:

         https://cloud.tencent.com/developer/article/1858199

proxy_cookie_path 语法

proxy_cookie_path source target;
  • source 源路径
  • target 目标路径

使用原因

        cookie 的 path 与地址栏上的 path 不一致, 浏览器就不会接受这个 cookie, 无法传入 JSESSIONID 的 cookie, 导致登录验证失败.

使用场景

当 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 的官方文档吧!

nginx 官方文档

官方介绍的地址如下: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cookie_path

语法:
    proxy_cookie_path off;
    proxy_cookie_path path replacement;
    # 二者选其一或者同时存在, 同时存在就是 off 了
默认:
    proxy_cookie_path off;
上下文:
    http, server, location

这个指令是从 1.1.15 版本开始引入的.

        可以设置被代理服务器响应中的 Set-Cookie 这个路径属性. 假被设代理服务器返回的 Set-Cookie 头的 path 字段的属性是 path=/two/some/uri/.

        那么这个指令 proxy_cookie_path /two/ /; 会将这个属性重写为 path=/some/uri/.

我感觉这个就是一种替换, 将  /two/ 替换为  / 了

        path 和 replacement 可以包含变量: proxy_cookie_path $uri /some$uri;

        The directive can also be specified using regular expressions. In this case, path should either start from the ~ symbol for a case-sensitive matching, or from the ~* symbols for case-insensitive matching. The regular expression can contain named and positional captures, and replacement can reference them:

proxy_cookie_path ~*^/user/([^/]+) /u/$1;

同一级可以指定多个 proxy_cookie_path 指令:

proxy_cookie_path /one/ /;
proxy_cookie_path / /two/;

如果有多个指令都可以匹配上 cookie 的路径,nginx 会选择第一个匹配的指令.

off 参数会将所有继承的 proxy_cookie_path 都取消掉.

1.为什么cookie会丢失?

        一个没有经过代理的地址如:http://127.0.0.1/project,它cookie的path为:/project

        但如果做了代理的处理,如地址:http://127.0.0.1/proxy_path,那cookie的path就变为了代理地址:/proxy_path

        如果cookie的path与地址栏上的path不相符游览器就不会接受这个cookie,那每次请求都会重新生成cookie,cookie中存放这sessionId,自然session也就跟着失效了。

2.nginx中proxy_cookie_path 的用法

        proxy_cookie_path 的作用是用来改变cookie的路径语法:proxy_cookie_path path replacement;

  path是你要替换的路径 replacement 就是要替换为的值。详情可以去nginx 官网看看传送门

3.下面分别分三种情况处理

1.host、端口转换,cookie不会丢失:
    location /project {
        proxy_pass   http://127.0.0.1:8080/project;
    }
2.路径也变化,则需要设置cookie的路径转换:
    location /proxy_path {
        proxy_pass   http://127.0.0.1:8080/project;
        proxy_cookie_path  /project /proxy_path;
    }
3.直接代理本地端口:
    location /proxy_path {
        proxy_pass   http://127.0.0.1:8080/;
        proxy_cookie_path  /project /proxy_path; # project 为你的项目名 也可用变量代替
    }

如何查看 Set-Cookie

其实很简单, chrome F12 打开调试, 然后登录之后, 就可以看到接口 set-cookie 的响应了, 如下图

file

        如果这个 path 和浏览器地址栏的不一致, 浏览器会拒绝写入这个 cookie, 相当于登陆了个寂寞.

原文地址: Nginx 中 proxy_cookie_path 的用法

转自:

 http://blog.duhbb.com/

<think>好的,我现在需要帮助用户解决在Nginx中正确配置proxy_cookie_path参数的问题。首先,我需要回忆一下关于这个配置项的相关知识。根据用户提供的引用内容,特别是引用[1]中的官方文档,proxy_cookie_path的语法有两种形式:一种是关闭(off),另一种是设置路径替换(path replacement)。默认情况下是关闭的,上下文在http、server、location块里。 用户可能遇到了反向代理时cookie路径不匹配的问题,导致session或cookie丢失。这时候需要调整proxy_cookie_path来修改cookiepath属性。例如,如果后端应用设置的cookie路径是/backend/,而代理后的路径是/front/,那么cookie可能不会被浏览器发送到正确的路径,需要将路径替换掉。 接下来,我需要整理配置步骤。首先,用户需要在Nginx的配置文件中找到对应的location块,里面已经有proxy_pass指令。然后,添加proxy_cookie_path的配置。例如,如果后端返回的cookie路径是/old_path/,代理后的路径是/new_path/,那么配置应该是proxy_cookie_path /old_path/ /new_path/;。同时,可能需要设置proxy_cookie_domain来调整domain,不过用户的问题集中在path上。 还要注意,如果替换后的路径需要提升到根路径,可以使用正则表达式,比如proxy_cookie_path ~^/backend/(.*) /$1;,这样将/backend/开头的路径转为根路径。同时,用户可能需要了解inactive和valid缓存时间的区别,不过根据引用[2],这可能与proxy_cache_path的其他参数有关,但用户的问题主要关于cookie,所以这部分可能暂时不需要深入。 另外,用户可能需要了解如何测试配置是否正确。比如,检查响应头中的Set-Cookie字段,确认path是否被正确替换。同时,提醒用户配置后要重载Nginx服务,使用nginx -s reload命令。 最后,根据用户提供的引用[3],CSDN博客中可能提到反向代理时cookie丢失的问题,需要确保proxy_cookie_pathproxy_cookie_domain都正确配置。例如,如果后端应用在/backend路径下,而代理在根路径,就需要将cookiepath从/backend改为/,否则浏览器不会发送cookie到其他路径。 总结回答的结构应该是:首先说明proxy_cookie_path的作用,然后给出基本语法,接着提供典型配置示例,最后注意事项和常见问题。确保引用正确的来源,如官方文档和CSDN的案例,帮助用户理解如何应用。</think>### Nginxproxy_cookie_path的配置方法 #### 1. 参数作用 `proxy_cookie_path`用于反向代理场景下,调整后端服务器返回的**Cookie路径属性**。当代理前后路径不一致时,浏览器可能因路径不匹配而丢失Cookie[^3]。 #### 2. 基本语法 ```nginx proxy_cookie_path off; # 关闭路径修改 proxy_cookie_path <原始路径> <替换路径>; ``` - 默认值:`off` - 支持正则表达式匹配(以`~`开头) - 配置位置:`http`, `server`, `location`块[^1] #### 3. 典型配置示例 **场景:** 后端应用在`/api`路径,代理到根路径`/` ```nginx location / { proxy_pass http://backend_server/api; proxy_cookie_path /api/ /; proxy_cookie_domain $host example.com; # 同时修改domain的案例 } ``` 此时会将所有`Set-Cookie`头中的路径`/api/xxx`转换为`/xxx` **正则表达式用法:** ```nginx proxy_cookie_path ~^/backend/(.*) /$1; ``` 此配置将`/backend/user`的路径转换为`/user` #### 4. 调试技巧 1. 使用`curl -I`查看响应头中的`Set-Cookie`字段 2. 检查路径转换是否生效: ```bash # 预期输出 Set-Cookie: SESSIONID=123; Path=/new_path curl -i http://your-domain.com/old_path/login ``` #### 5. 注意事项 1. 必须与`proxy_pass`配合使用 2. 路径替换需遵循**目录层级对应原则** 3. 修改配置后执行`nginx -s reload`重载服务 4. 若涉及多级路径,建议使用正则表达式精确匹配[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值