apache反向代理,浏览器访问context与后端应用context不一致的处理

2 篇文章 0 订阅
2 篇文章 0 订阅

某些应用,存在历史原因

浏览器只能访问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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值