【问题标题】:Apache Reverse Proxy Sending Browser to Backend Directly InsteadApache反向代理将浏览器直接发送到后端
【发布时间】:2015-09-21 19:08:34
【问题描述】:

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),但我相信如果反向代理工作正常,浏览器会没有一个更聪明。有人看到上面有什么问题吗?

更新

我找到了罪魁祸首:

&lt;script type="text/javascript"&gt;window.location.assign('https://internal.company.com/app1/login?redirectUrl=' + encodeURIComponent(window.location.pathname + window.location.hash));&lt;/script&gt;

问题是,如何使用 Apache 重写这个绝对 URL?我知道 mod_proxy_html 会修改元素属性(例如 a 元素中的 href),但它可以重写元素本身中的任意数据吗?

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

【问题讨论】:

  • 如果您查看链接的原始 html,链接是 还是 internal.company.com/app1>?您可能需要查看 proxy_html (我认为这是模块)重写 HTML 以删除对内部 URL 的引用(可能取决于您对网站的控制程度...... sharepoint 往往非常棒)
  • HTML 是 &lt;a href="/app1"&gt;。这里还有 SSO 发生在幕后; internal.company.com 正在读取包含用户授权的 cookie。我在想这就是事情正在下降的地方。我会调查 proxy_html。

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    一个可能更安全的解决方案是使用mod_substitute。你也可以考虑ProxyHTMLExtended,但它的替代品可能相当残酷,偶尔会破坏 JavaScript。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      相关资源
      最近更新 更多