Apache 代理不同的上下文路径 cookie 问题
Apache proxy different context path cookie issue
我目前正在开发一个将部署在 Docker 容器中的应用程序。 Docker 包含一个 Tomcat,运行 将应用程序作为 ROOT.war,因此处于顶层。
想法是,当我们的用户 运行 容器时,他们可能希望 运行 在其服务器上的特定上下文路径上的多个副本,例如:
https://somedomain.com/a
和 https://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 中服务器上的上下文路径始终为空,因此存在会话问题。
我见过几个关于类似情况的问题,但在所有情况下,人们都可以更改 public 路径或 Tomcat 中的路径以使它们匹配。就我而言,我根本不能那样做,因为我会规定我们软件的用户必须使用哪条路径。
以下是此类问题的示例:
https://serverfault.com/questions/311994/how-to-proxy-context-to-different-backend-context-in-apache
https://serverfault.com/questions/495017/how-do-i-ensure-the-context-path-is-the-same-when-accessing-a-web-app-via-apache
有什么方法可以使这个设置正常工作吗?
我可以更改代理配置以以某种方式转发上下文路径吗?
还有其他选择吗?
好的,我找到了一个非常简单的解决方案。也许它会对其他人有所帮助,所以我将 post 放在这里:
我发现有一个名为 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 路径设置为 /
。然后反向代理将它映射回它被请求的地方。
我目前正在开发一个将部署在 Docker 容器中的应用程序。 Docker 包含一个 Tomcat,运行 将应用程序作为 ROOT.war,因此处于顶层。
想法是,当我们的用户 运行 容器时,他们可能希望 运行 在其服务器上的特定上下文路径上的多个副本,例如:
https://somedomain.com/a
和 https://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 中服务器上的上下文路径始终为空,因此存在会话问题。
我见过几个关于类似情况的问题,但在所有情况下,人们都可以更改 public 路径或 Tomcat 中的路径以使它们匹配。就我而言,我根本不能那样做,因为我会规定我们软件的用户必须使用哪条路径。
以下是此类问题的示例:
https://serverfault.com/questions/311994/how-to-proxy-context-to-different-backend-context-in-apache
https://serverfault.com/questions/495017/how-do-i-ensure-the-context-path-is-the-same-when-accessing-a-web-app-via-apache
有什么方法可以使这个设置正常工作吗?
我可以更改代理配置以以某种方式转发上下文路径吗?
还有其他选择吗?
好的,我找到了一个非常简单的解决方案。也许它会对其他人有所帮助,所以我将 post 放在这里:
我发现有一个名为 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 路径设置为 /
。然后反向代理将它映射回它被请求的地方。