濮阳杆衣贸易有限公司

主頁 > 知識庫 > nginx反向代理導(dǎo)致session失效的問題解決

nginx反向代理導(dǎo)致session失效的問題解決

熱門標(biāo)簽:繽客網(wǎng)注冊時地圖標(biāo)注出不來 重慶營銷外呼系統(tǒng)排名 400電話辦理哪家好廠商 地圖標(biāo)注企業(yè)名稱侵權(quán)案件 企業(yè)400電話辦理哪正規(guī) 鶴壁電銷外呼系統(tǒng)怎么安裝 工廠位置地圖標(biāo)注 地圖標(biāo)注需要現(xiàn)場嗎 網(wǎng)站上插入地圖標(biāo)注內(nèi)容

一同事求援:后臺系統(tǒng)的登錄成功了,但不能成功登進(jìn)系統(tǒng),仍然跳轉(zhuǎn)到登錄頁,但同一套代碼另一個環(huán)境卻沒有問題。

背景

經(jīng)了解,他對同一個項目使用tomcat部署了兩個環(huán)境,一個在開發(fā)服務(wù)器上,一個在他本機(jī),兩個環(huán)境代碼配置完全相同。兩邊通過同一個nginx進(jìn)行反向代理,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)境,一個反向代理到本機(jī)服務(wù)。

定位

既然代碼配置完全相同,那么問題很大可能就出現(xiàn)在nginx的反向代理上。

因為兩邊location路徑不同(即瀏覽器路徑不同),但是反向代理的服務(wù)端路徑卻相同,結(jié)合session的基本原理,如下圖,

  1. 當(dāng)瀏覽器第一次打開頁面時,服務(wù)端會為這次會話創(chuàng)建一個session,并將session id通過response的header傳遞給瀏覽器,header一般為 Set-Cookie: JSESSIONID=xxxxx; Path=xxxx
  2. 瀏覽器接收到響應(yīng)后,如果header Set-Cookie 中path的值與瀏覽器地址路徑匹配,則將該header值存于瀏覽器的Cookie中
  3. 瀏覽器在下次請求服務(wù)器時,將Cookie中的JSESSIONID值通過request的header上報給服務(wù)端,header一般為 Cookie: JSESSIONID=xxxx;
  4. 服務(wù)端可通過該JSESSIONID來定位到對應(yīng)的session

nginx反向代理按這種方式配置時

location /health-dev/ {
  proxy_pass http://192.168.40.202:8080/health/;
}

瀏覽器訪問 http://www.domian.com/health-dev 時,服務(wù)端返回的 Set-Cookie 的 Path 值為 /health (因為中間有反向代理,服務(wù)端并不知道代理前的路徑是啥,是按最終請求服務(wù)端的路徑設(shè)置),如圖

因為瀏覽器訪問地址的路徑 /health-devSet-Cookie 的 Path /health 不匹配,所以瀏覽器并不會將其值存入Cookie中,如圖

因此在下次請求服務(wù)器時,瀏覽器無法設(shè)置request Cookie header的 JSESSIONID 值,服務(wù)器無法定位到對應(yīng)的session,因此會將其當(dāng)做第一次請求,創(chuàng)建一個新的session,如此反復(fù),因此就算你登錄認(rèn)證通過了,但服務(wù)器返回的登錄憑證(JSESSIONID)瀏覽器不會保存,并在下次請求時攜帶,導(dǎo)致服務(wù)器認(rèn)為你是一個新的請求,當(dāng)然就會又跳到登錄頁面了。

解決

nginx有一個命令 proxy_cookie_path (參考: proxy_cookie_path )可將服務(wù)器返回的 Set-Cookie 中的path進(jìn)行修改,格式為 proxy_cookie_path 原路徑 目標(biāo)路徑 ,我們在配置中添加 proxy_cookie_path 如下。

location /health-dev/ {
  proxy_pass http://192.168.40.202:8080/health/;
  proxy_cookie_path /health /health-dev;
}

重啟nginx,問題解決。

到此這篇關(guān)于nginx反向代理導(dǎo)致session失效的問題解決的文章就介紹到這了,更多相關(guān)nginx反向代理導(dǎo)致session失效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

標(biāo)簽:東莞 常州 日照 克拉瑪依 鹽城 棗莊 96 渭南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《nginx反向代理導(dǎo)致session失效的問題解決》,本文關(guān)鍵詞  nginx,反向,代理,導(dǎo)致,session,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《nginx反向代理導(dǎo)致session失效的問題解決》相關(guān)的同類信息!
  • 本頁收集關(guān)于nginx反向代理導(dǎo)致session失效的問題解決的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    平潭县| 安图县| 清水县| 郴州市| 承德市| 高青县| 靖边县| 丘北县| 宜川县| 申扎县| 兴隆县| 阿图什市| 延长县| 新龙县| 辽阳市| 苗栗县| 保山市| 平乐县| 江都市| 滨海县| 临海市| 从江县| 侯马市| 昆山市| 丹凤县| 临西县| 仁化县| 凤庆县| 湘西| 长沙市| 惠来县| 衡阳县| 永城市| 舒兰市| 泰州市| 望谟县| 富川| 轮台县| 武夷山市| 稷山县| 富平县|