(主要问题底部的更新,下面可能是多余的细节)
我遇到了一个有趣的问题,Apache 没有按预期进行反向代理。
基本上,发生的事情是当我点击我的网站上指向相对路径的链接时/app1
,我希望它的 URLexternal.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
元素中),但它可以重写元素本身的任意数据吗?
内部应用程序由供应商提供,尽管可以对其进行修改以删除上述代码,但我现在更愿意远离该路径,看看是否有替代方案。