nginx反向代理(proxy_pass)tomcat的过程中,session失效的问题解决

学习nginx http://www.nginx.cn/nginx-how-to

 Nginx反向代理tomcat,很是方便,但是也有些细节的问题需要注意;今天遇到了这样一个问题,tomcat中路径“host/web1”,nginx中直接“host/”代理,这时候session就无法正常进行了。

问题描述: 登录后. 跳转http://127.0.0.1:8080/api/index.do 可以正常访问

              nginx 反向代理 proxy_pass  http://192.168.1.12:8080/api/ 登录之后跳转   http://api.tomas.com/index.do 没有带过去cookie 导致拦截跳转登录页

 

原因分析: 关键在于tomcat 中的应用context 路径是 /api , 而nginx代理后访问 context 路径是 / , JSESSIONID 的值从浏览器经过反向代理到达tomcat时, 由于cookie时内外路径不一致, 使tomcat每次重写设置 JSESSIONID 的值,导致session丢失现象.

之前nginx.conf 配置如下:

server{

   listen 80;
   server_name api.tommas.com;
   location / {
            proxy_pass   http://192.168.1.12:8080/api/;
            proxy_set_header   Host    $host;
            proxy_set_header   Remote_Addr    $remote_addr;
            proxy_set_header   X-Real-IP    $remote_addr;
            proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;
        }
} 

而后检查是由于cookies path问题导致,阅读官方资料中显示proxy_cookie_path,遂调整

server{

 

   listen 80;

   server_name api.tommas.com;

   location / {

            proxy_pass   http://192.168.1.12:8080/api/;

           #proxy_pass  代理 (包含项目名)的url时 注意cookie的Path

            proxy_cookie_path /api/ /;

            proxy_set_header   Host    $host;

            proxy_set_header   Remote_Addr    $remote_addr;

            proxy_set_header   X-Real-IP    $remote_addr;

            #proxy反向代理header 有可能经过了多级nginx代理 想取原始IP(多个取第一个是原始IP 其余的为代理ip)

            proxy_set_header   X-Forwarded-For    $proxy_add_x_forwarded_for;           

        }


}

测试 解决问题。

 

参考资料: http://nginx.org/en/docs/http/ngx_http_proxy_module.html?&_ga=1.161910972.1696054694.1422417685#proxy_cookie_path

 

nginx 配置写法方式二: 

加上路径转换:proxy_cookie_path  /project /proxy_path;

则可以将project的cookie输出到proxy_path上。正确的配置是:

    location /proxy_path {
        proxy_pass   http://127.0.0.1:8080/project;
        proxy_cookie_path  /project /proxy_path;
    }

 


posted @   托马斯布莱克  阅读(14985)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
点击右上角即可分享
微信分享提示