某些应用,存在历史原因
浏览器只能访问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