一同事求援:後臺系統的登陸成功了,但不能成功登進系統,仍然跳轉到登陸頁,但同一套代碼另外一個環境卻沒有問題。html
經瞭解,他對同一個項目使用tomcat部署了兩個環境,一個在開發服務器上,一個在他本機,兩個環境代碼配置徹底相同。兩邊經過同一個nginx進行反向代理,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/; #有問題的配置 }
一個反向代理到開發環境,一個反向代理到本機服務。瀏覽器
既然代碼配置徹底相同,那麼問題很大可能就出如今nginx的反向代理上。tomcat
由於兩邊location路徑不一樣(即瀏覽器路徑不一樣),可是反向代理的服務端路徑卻相同,結合session的基本原理,以下圖,服務器
Set-Cookie: JSESSIONID=xxxxx; Path=xxxx
Cookie: JSESSIONID=xxxx;
nginx反向代理按這種方式配置時cookie
location /health-dev/ { proxy_pass http://192.168.40.202:8080/health/; }
瀏覽器訪問 http://www.domian.com/health-dev
時,服務端返回的 Set-Cookie
的 Path 值爲 /health
(由於中間有反向代理,服務端並不知道代理前的路徑是啥,是按最終請求服務端的路徑設置),如圖session
由於瀏覽器訪問地址的路徑 /health-dev
與 Set-Cookie
的 Path /health
不匹配,因此瀏覽器並不會將其值存入Cookie中,如圖dom
所以在下次請求服務器時,瀏覽器沒法設置request Cookie
header的 JSESSIONID
值,服務器沒法定位到對應的session,所以會將其當作第一次請求,建立一個新的session,如此反覆,所以就算你登陸認證經過了,但服務器返回的登陸憑證(JSESSIONID)瀏覽器不會保存,並在下次請求時攜帶,致使服務器認爲你是一個新的請求,固然就會又跳到登陸頁面了。代理
nginx有一個命令 proxy_cookie_path
(參考: proxy_cookie_path)可將服務器返回的 Set-Cookie
中的path進行修改,格式爲 proxy_cookie_path 原路徑 目標路徑
,咱們在配置中添加 proxy_cookie_path
以下。code
location /health-dev/ { proxy_pass http://192.168.40.202:8080/health/; proxy_cookie_path /health /health-dev; }
重啓nginx,問題解決。
[轉載請註明出處]
做者:雨歌
歡迎關注做者公衆號:半路雨歌,查看更多技術乾貨文章