问题 Apache - 反向代理和HTTP 302状态消息


我的团队正在尝试从客户的站点将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


5528
2017-10-09 22:30


起源



答案:


有一篇标题为的文章 在Apache中运行反向代理 这似乎解决了你的问题。它甚至使用您的示例中的example.com和/ app1。有关如何使用的示例,请转到“配置代理”部分 ProxyPassReverse


11
2017-10-10 00:42





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

我之所以提到这一点,只是因为我们代理的另一个第三方应用程序发送的重定向不包括其内部主机名,只是一个不同的端口。

最后要注意的是,请记住这一点 萤火 在调试重定向时非常有用。


2
2017-10-23 16:50





尝试使用AJP连接器而不是反向代理。当然不是一个微不足道的改变,但我发现当使用AJP而不是反向代理时,很多URL噩梦消失了。


1
2017-10-09 22:40



我花了3个小时试图找到一种可靠的方法来阻止http重定向通过没有AJP的https代理。我最终通过在ProxyPass和ProxyPassReverse指令中使用ajp而不是http来解决这个问题。 - Gnafu


答案:


有一篇标题为的文章 在Apache中运行反向代理 这似乎解决了你的问题。它甚至使用您的示例中的example.com和/ app1。有关如何使用的示例,请转到“配置代理”部分 ProxyPassReverse


11
2017-10-10 00:42





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

我之所以提到这一点,只是因为我们代理的另一个第三方应用程序发送的重定向不包括其内部主机名,只是一个不同的端口。

最后要注意的是,请记住这一点 萤火 在调试重定向时非常有用。


2
2017-10-23 16:50





尝试使用AJP连接器而不是反向代理。当然不是一个微不足道的改变,但我发现当使用AJP而不是反向代理时,很多URL噩梦消失了。


1
2017-10-09 22:40



我花了3个小时试图找到一种可靠的方法来阻止http重定向通过没有AJP的https代理。我最终通过在ProxyPass和ProxyPassReverse指令中使用ajp而不是http来解决这个问题。 - Gnafu