nginx反向代理導致session失效的問題解決
一同事求援:后臺系統(tǒng)的登錄成功了,但不能成功登進系統(tǒng),仍然跳轉到登錄頁,但同一套代碼另一個環(huán)境卻沒有問題。
背景
經了解,他對同一個項目使用tomcat部署了兩個環(huán)境,一個在開發(fā)服務器上,一個在他本機,兩個環(huán)境代碼配置完全相同。兩邊通過同一個nginx進行反向代理,nginx配置大致如下,
location /health/ { proxy_pass http://192.168.40.159:8081/health/; #無問題的配置 } location /health-dev/ { proxy_pass http://192.168.40.202:8080/health/; #有問題的配置 }
一個反向代理到開發(fā)環(huán)境,一個反向代理到本機服務。
定位
既然代碼配置完全相同,那么問題很大可能就出現(xiàn)在nginx的反向代理上。
因為兩邊location路徑不同(即瀏覽器路徑不同),但是反向代理的服務端路徑卻相同,結合session的基本原理,如下圖,
- 當瀏覽器第一次打開頁面時,服務端會為這次會話創(chuàng)建一個session,并將session id通過response的header傳遞給瀏覽器,header一般為 Set-Cookie: JSESSIONID=xxxxx; Path=xxxx
- 瀏覽器接收到響應后,如果header Set-Cookie 中path的值與瀏覽器地址路徑匹配,則將該header值存于瀏覽器的Cookie中
- 瀏覽器在下次請求服務器時,將Cookie中的JSESSIONID值通過request的header上報給服務端,header一般為 Cookie: JSESSIONID=xxxx;
- 服務端可通過該JSESSIONID來定位到對應的session
nginx反向代理按這種方式配置時
location /health-dev/ { proxy_pass http://192.168.40.202:8080/health/; }
瀏覽器訪問 http://www.domian.com/health-dev
時,服務端返回的 Set-Cookie
的 Path 值為 /health
(因為中間有反向代理,服務端并不知道代理前的路徑是啥,是按最終請求服務端的路徑設置),如圖
因為瀏覽器訪問地址的路徑 /health-dev
與 Set-Cookie
的 Path /health
不匹配,所以瀏覽器并不會將其值存入Cookie中,如圖
因此在下次請求服務器時,瀏覽器無法設置request Cookie
header的 JSESSIONID
值,服務器無法定位到對應的session,因此會將其當做第一次請求,創(chuàng)建一個新的session,如此反復,因此就算你登錄認證通過了,但服務器返回的登錄憑證(JSESSIONID)瀏覽器不會保存,并在下次請求時攜帶,導致服務器認為你是一個新的請求,當然就會又跳到登錄頁面了。
解決
nginx有一個命令 proxy_cookie_path
(參考: proxy_cookie_path )可將服務器返回的 Set-Cookie
中的path進行修改,格式為 proxy_cookie_path 原路徑 目標路徑
,我們在配置中添加 proxy_cookie_path
如下。
location /health-dev/ { proxy_pass http://192.168.40.202:8080/health/; proxy_cookie_path /health /health-dev; }
重啟nginx,問題解決。
到此這篇關于nginx反向代理導致session失效的問題解決的文章就介紹到這了,更多相關nginx反向代理導致session失效內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Nginx配置動態(tài)代理后通過curl訪問報403問題
本文主要介紹了Nginx配置動態(tài)代理后通過curl訪問報403問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06Nginx如何獲取自定義請求header頭和URL參數(shù)詳解
這篇文章主要給大家介紹了關于Nginx如何獲取自定義請求header頭和URL參數(shù)的相關資料,本文適用于需要在nginx里獲取http請求頭信息或者傳遞的參數(shù)進行一些計算和處理的情況,需要的朋友可以參考下2022-07-07Nginx+Tomcat反向代理與負載均衡的實現(xiàn)
這篇文章給大家詳細介紹了如何實現(xiàn)Nginx+Tomcat反向代理與負載均衡,文中的流程步驟介紹的非常詳細對我們的學習或工作有一定的幫助,需要的朋友可以參考下2023-07-07nginx的location配置導致網(wǎng)關返回404問題
這篇文章主要介紹了nginx的location配置導致網(wǎng)關返回404問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06詳解Nginx服務器中配置Sysguard模塊預防高負載的方案
這篇文章主要介紹了詳解Nginx服務器中配置Sysguard模塊預防高負載的方案,該模塊由阿里巴巴的團隊開發(fā),能夠設置負載閥值,比較強大,需要的朋友可以參考下2016-01-01