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

我遇到了一个有趣的问题,Apache 没有按预期进行反向代理。

基本上,发生的事情是当我点击我网站上的一个链接到相对路径 /app1 时,我期望它的 URL 是 external.company.ca/app1 ,内容来自 internal.company.ca/some_app 。相反,浏览器将直接转到 internal.company.ca/some_app

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

这是从客户端(浏览器)的角度捕获的 Fiddler 捕获,显示了我单击转到 /app1 的链接后的行为(您必须相信我,绿色名称是 external.company.ca,黑色名称是 internal.company.com 和路径是 /some_app/blahblah ):

在这一点之后发生的一切都是用 internal.company.com 加载页面。当然,这在生产中根本不起作用。

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

<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>

有一次,我认为 cookie 可能会丢东西,因为它们位于不同的域下(前面是 .ca,后面是 .com),但我相信如果反向代理工作正常,浏览器也不会更聪明.有没有人看到上面有什么问题?

更新

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

内部应用程序由供应商提供,虽然可以对其进行修改以删除上述代码,但我现在更愿意远离该路径,看看是否有替代方法。

最佳答案

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

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

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

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

关于Apache 反向代理直接将浏览器发送到后端,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31215315/

10-15 10:57