Apache反向代理将浏览器直接发送到后端

时间:2015-07-03 23:32:16

标签: apache reverse-proxy mod-proxy-html

(主要问题底部的更新,下面可能是多余的细节)

我有一个有趣的问题,Apache没有像预期的那样反向代理。

基本上,当我点击我网站上指向相对路径/app1的链接时,我发现它的内容来自external.company.ca/app1的内容来自internal.company.ca/some_app {1}}。相反,浏览器将直接转到internal.company.ca/some_app

没有302或任何东西,只是直接在那里。这对我来说很奇怪,因为除了反向代理配置之外,配置中没有提到internal.company.ca,所以我根本不知道浏览器是如何学习域的。

从客户端(浏览器)的角度来看,这是一个Fiddler捕获,在我点击转到/app1的链接后立即显示行为(您必须相信我的绿色名称是{ {1}},黑色名称为external.company.ca,路径为internal.company.com):

enter image description here

此后发生的所有事情都是使用/some_app/blahblah加载页面。当然,这在生产中根本不起作用。

以下是我们的Apache配置文件的(截断的)版本供考虑:

internal.company.com

有一次,我认为可能是因为它们处于不同的域(前面的.ca,后面的.com)中,因此可能会丢弃cookie,但我相信如果反向代理工作正常,浏览器将是没有更聪明的人。有人看到上面的任何问题吗?

更新

我找到了罪魁祸首:

<VirtualHost *:80> # rewrite rules to 443 </VirtualHost> <VirtualHost *:443> ServerName external.company.ca ServerAlias external.company.com # Logging rules......... SSLEngine on SSLProxyEngine on SSLProxyVerify none # Most of this is off for testing purposes, adding in case it matters SSLProxyCheckPeerCN off SSLProxyCheckPeerName off SSLProxyCheckPeerExpire off # more SSL stuff.... Now on to the interesting part ProxyPreserveHost On ProxyPass /app1 https://internal.company.com/some_app ProxyPassReverse /app1 https://internal.company.com/some_app </VirtualHost>

问题是,如何使用Apache重写此绝对URL?我知道mod_proxy_html会修改元素属性(例如<script type="text/javascript">window.location.assign('https://internal.company.com/app1/login?redirectUrl=' + encodeURIComponent(window.location.pathname + window.location.hash));</script>元素中的href)但是它可以重写元素本身中的任意数据吗?

内部应用程序是由供应商提供的,虽然可以对其进行修改以删除上述代码,但我现在希望远离这条路径以查看是否有替代方案。

2 个答案:

答案 0 :(得分:0)

我想出了一个有点讨厌的解决办法:

ProxyHTMLEnable On
ProxyHTMLExtended On
ProxyHTMLLinks script src
ProxyHTMLURLMap https://internal.company.com

问题是在整个来自供应商应用的HTML(和javascript)中使用绝对URL。搜索和删除域可以解决问题(但速度极慢)。

如果将来有人遇到此问题,我不建议使用此解决方案。我猜你在这里是因为你无法修改内部应用程序。相反,您应该向维护代码的人发送票证,以使其应用程序更加反向代理友好。

答案 1 :(得分:0)

可能更安全的解决方案是使用mod_substitute。你也可以考虑ProxyHTMLExtended,但它的替代品可能非常残酷,偶尔会在这里和那里打破JavaScript。

编辑:刚刚注意到您目前正在使用ProxyHTMLExtended。我的错。正如您所强调的那样,这是一个非常残酷和危险的解决方案。