我的团队正在尝试将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中设置反向代理,以便重定向正常工作?
答案 0 :(得分:12)
有一篇标题为Running a Reverse Proxy in Apache的文章似乎可以解决您的问题。它甚至使用您的示例中的example.com和/ app1。有关如何使用ProxyPassReverse的示例,请转到“配置代理”部分。
答案 1 :(得分:3)
AskApache article非常有用,但实际上我发现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
我之所以提到这一点,只是因为我们代理的另一个第三方应用程序发送的重定向不包含其内部主机名,只是一个不同的端口。
最后请注意,请记住Firebug在调试重定向时非常有用。
答案 2 :(得分:1)
尝试使用AJP连接器而不是反向代理。当然不是一个微不足道的改变,但我发现当使用AJP而不是反向代理时,很多URL噩梦消失了。
答案 3 :(得分:0)
基本上,ProxyPassReverse
应该为您改写Location标头,正如Kevin Hakanson指出的那样。
我遇到的一个陷阱是url参数中缺少尾部斜杠。确保使用:
ProxyPassReverse / http://internal1.example.com/some-path/
(请注意斜杠!)