首页 文章

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

提问于
浏览
4

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

我有一个有趣的问题,Apache没有按预期反向代理 .

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

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

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

enter image description here

在此之后发生的一切都是使用 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>

有一次,我认为可能是因为它们处于不同的域(前面的.ca,后面的.com)中,因此可能会丢弃cookie,但我相信如果反向代理工作正常,浏览器将不再是明智之举 . 有人看到上面有什么不对吗?

UPDATE

我找到了罪魁祸首:

<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修改元素属性(例如 a 元素中的 href ),但是它可以重写元素本身的任意数据吗?

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

2 回答

  • 0

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

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

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

    如果将来有人遇到此问题,请在此处重新启动,因为您无法修改内部应用程序 . 相反,您应该向维护代码的人发送票证,以使其应用程序更具反向代理友好性 .

  • 0

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

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

相关问题