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

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