Apache代理不同的上下文路径cookie问题

问题描述 投票:0回答:1

我目前正在开发将部署在Docker容器中的应用程序。 Docker包含一个Tomcat,它将Tomcat作为ROOT.war运行在顶层。

这个想法是,当我们的用户运行容器时,他们可能希望在各自服务器上的特定上下文路径上运行多个副本,因此,例如:

[https://somedomain.com/ahttps://somedomain.com/b

我的计划是简单地告诉他们像这样配置反向代理:

ProxyPreserveHost On
RewriteEngine On

# Map https://somedomain/a to http://internalserver:9001
RewriteRule     ^/a$ /a/ [R]
ProxyPass        /a/ http://internalserver:9001/
ProxyPassReverse /a/ http://internalserver:9001/

# Map https://somedomain/b to http://internalserver:9002
RewriteRule     ^/b$ /b/ [R]
ProxyPass        /b/ http://internalserver:9002/
ProxyPassReverse /b/ http://internalserver:9002/

9001和9002是运行我的应用程序副本的两个Docker容器的端口。

现在,这使应用程序运行,但是cookie存在问题,因为Tomcat中服务器上的上下文路径始终为空,因此存在会话问题。

我已经看到了类似情况的几个问题,但是在所有情况下,人们都可以更改公共路径或Tomcat中的路径以使它们匹配。就我而言,我根本无法做到这一点,因为我将决定我们软件的用户必须使用哪种路径。

以下是此类问题的示例:

https://serverfault.com/questions/311994/how-to-proxy-context-to-different-backend-context-in-apachehttps://serverfault.com/questions/495017/how-do-i-ensure-the-context-path-is-the-same-when-accessing-a-web-app-via-apacheTomcat behind an apache proxy error on path


有什么方法可以使此设置正常工作?

我可以更改代理配置以某种方式转发上下文路径吗?

还有其他选择吗?

apache docker tomcat reverse-proxy contextpath
1个回答
0
投票

确定,我找到了一个非常简单的解决方案。也许会帮助别人,所以我将其发布在这里:

我发现有一个名为ProxyPassReverseCookiePath的代理配置选项,该选项恰好用于我要实现的目标,因此我将配置更改为:

RewriteRule      ^/a$ /a/ [R]
<Location /a/>
  ProxyPass        http://internalserver:9001/
  ProxyPassReverse http://internalserver:9001/
  ProxyPassReverseCookiePath / /a
</Location>
RewriteRule      ^/b$ /b/ [R]

<Location /b/>
  ProxyPass        http://internalserver:9002/
  ProxyPassReverse http://internalserver:9002/
  ProxyPassReverseCookiePath / /b
</Location>

这根据应用程序将来自内部服务器的每个cookie路径都映射为//a/b,这正是我想要的。现在,如果没有上下文路径可用,则应用程序本身始终将cookie路径设置为/。然后,反向代理会将其映射回到请求它的位置。

© www.soinside.com 2019 - 2024. All rights reserved.