某些應用,存在歷史原因
瀏覽器只能訪問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報錯
發現先進行了302 ,重定向訪問的是 http://www.aaa.com/ccc
問題分析:
1)wget訪問一次後,檢查netstat -an|grep 8080
發現確實出現了ESTABLISHED連接,也就是說連接到達了後端的應用
- 增加了配置
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