apache反向代理,瀏覽器上下文根與後端應用上下文根不一致的處理

某些應用,存在歷史原因

瀏覽器只能訪問http://www.aaa.com/bbb

而後端的應用上下文根其實爲/ccc

 

在apache服務器中,做了如下配置

ProxyPass /bbb  http://www.ddd.com:8080/ccc

ProxyPassReverse /bbb  http://www.ddd.com:8080/ccc

 

發現問題有二:

1,

問題現象:

訪問後會出現404報錯

wget http://www.aaa.com/bbb

發現先進行了302 ,重定向訪問的是 http://www.aaa.com/ccc

問題分析:

1)wget訪問一次後,檢查netstat -an|grep 8080

發現確實出現了ESTABLISHED連接,也就是說連接到達了後端的應用

  1. 增加了配置

ProxyPass /ccc  http://www.ddd.com:8080/ccc

ProxyPassReverse /ccc  http://www.ddd.com:8080/ccc

發現訪問成功了,access日誌裏中出現了類似

http://www.aaa.com:8080/ccc/123/456的訪問內容

說明後端的應用會對訪問的請求重定向,因此會有302.

而重定向之後,訪問的內容類似http://www.aaa.com:8080/ccc/123/456,

因此需要多增加/ccc的轉發配置。

 

2,

問題現象:無法會話保持

問題分析:

查閱資料,發現原理如下:

會話保持的cookie保存的路徑(path屬性)默認是訪問內部應用的上下文根,但是如果遇到以下情況

訪問http://www.aaa.com/

代理配置爲ProxyPass / http://www.bbb.com/ccc

則對於後端的應用來說,默認會把cookie的path設置爲/ccc。

然後cookie傳給瀏覽器,瀏覽器再次訪問時,cookie保存在/ccc,而訪問的上下文是/,則瀏覽器認爲沒有cookie。

因此需要在代理上或者在代碼裏,明確的設定cookie的path屬性爲/。

下面爲設置cookie中path屬性的方法:

1)Apache設置指令 ProxyPassReverseCookiePath /ccc /

2)Nginx設置指令 proxy_cookie_path  /ccc /

3)Ingress設置參數nginx.ingress.kubernetes.io/proxy-cookie-path: "/ccc /"

4)Java代碼裏也可以指定path屬性

 response.set_cookie('username', 'aaa', path='/', expires=datetime.now() + timedelta(days=7))

 

結論:正確配置如下:

ProxyPass /ccc  http://www.ddd.com:8080/ccc

ProxyPassReverse /ccc  http://www.ddd.com:8080/ccc

ProxyPass /bbb  http://www.ddd.com:8080/ccc

ProxyPassReverse /bbb  http://www.ddd.com:8080/ccc

ProxyPassReverseCookiePath /ccc  /bbb

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章