我的团队正在尝试从客户的站点将Apache反向代理设置到我们的一个Web应用程序中。
http://www.example.com/app1/some-path 映射到 http://internal1.example.com/some-path
在我们的应用程序中,我们使用struts并在某些操作上设置redirect = true以提供某些功能。来自这些重定向的302状态消息导致用户突破代理,从而导致最终用户的错误页面。
找到HTTP / 1.1 302
位置: http://internal.example.com/some-path/redirect
有没有办法在apache中设置反向代理,以便重定向正常工作?
http://www.example.com/app1/some-path/redirect
有一篇标题为的文章 在Apache中运行反向代理 这似乎解决了你的问题。它甚至使用您的示例中的example.com和/ app1。有关如何使用的示例,请转到“配置代理”部分 ProxyPassReverse。
该 AskApache文章 非常有用,但实际上我发现Rewrite规则和ProxyPassReverse的组合更灵活。所以在你的情况下,我会做这样的事情:
<VirtualHost example>
ServerName www.example.com
ProxyPassReverse /app1/some-path/ http://internal1.example.com/some-path/
RewriteEngine On
RewriteRule /app1/(.*) http://internal1.example.com/some-path$1 [P]
...
</VirtualHost>
我更喜欢这个,因为它可以让您对代理内部服务器的路径进行更精细的控制。在我们的例子中,我们只想公开部分第三方应用程序。请注意,这不涉及HTML中的硬编码链接,AskApache文章介绍了这些链接。
另请注意,您可以拥有多个ProxyPassReverse行:
ProxyPassReverse / http://internal1.example.com/some-path
ProxyPassReverse / http://internal2.example.com/some-path
我之所以提到这一点,只是因为我们代理的另一个第三方应用程序发送的重定向不包括其内部主机名,只是一个不同的端口。
最后要注意的是,请记住这一点 萤火 在调试重定向时非常有用。
尝试使用AJP连接器而不是反向代理。当然不是一个微不足道的改变,但我发现当使用AJP而不是反向代理时,很多URL噩梦消失了。
有一篇标题为的文章 在Apache中运行反向代理 这似乎解决了你的问题。它甚至使用您的示例中的example.com和/ app1。有关如何使用的示例,请转到“配置代理”部分 ProxyPassReverse。
该 AskApache文章 非常有用,但实际上我发现Rewrite规则和ProxyPassReverse的组合更灵活。所以在你的情况下,我会做这样的事情:
<VirtualHost example>
ServerName www.example.com
ProxyPassReverse /app1/some-path/ http://internal1.example.com/some-path/
RewriteEngine On
RewriteRule /app1/(.*) http://internal1.example.com/some-path$1 [P]
...
</VirtualHost>
我更喜欢这个,因为它可以让您对代理内部服务器的路径进行更精细的控制。在我们的例子中,我们只想公开部分第三方应用程序。请注意,这不涉及HTML中的硬编码链接,AskApache文章介绍了这些链接。
另请注意,您可以拥有多个ProxyPassReverse行:
ProxyPassReverse / http://internal1.example.com/some-path
ProxyPassReverse / http://internal2.example.com/some-path
我之所以提到这一点,只是因为我们代理的另一个第三方应用程序发送的重定向不包括其内部主机名,只是一个不同的端口。
最后要注意的是,请记住这一点 萤火 在调试重定向时非常有用。
尝试使用AJP连接器而不是反向代理。当然不是一个微不足道的改变,但我发现当使用AJP而不是反向代理时,很多URL噩梦消失了。