Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache反向代理将浏览器直接发送到后端_Apache_Reverse Proxy_Mod Proxy Html - Fatal编程技术网

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

Apache反向代理将浏览器直接发送到后端,apache,reverse-proxy,mod-proxy-html,Apache,Reverse Proxy,Mod Proxy Html,(主要问题底部的更新,下面可能是多余的细节) 我在Apache方面遇到了一个有趣的问题,没有像预期的那样进行反向代理 基本上,当我在我的网站上点击指向相对路径/app1的链接时,我希望它的URL是external.company.ca/app1,内容来自internal.company.ca/some_app。相反,浏览器将直接进入internal.company.ca/some\u app 没有302什么的,就直接到那里。这对我来说很奇怪,因为除了反向代理配置,配置中没有提到internal.

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

我在Apache方面遇到了一个有趣的问题,没有像预期的那样进行反向代理

基本上,当我在我的网站上点击指向相对路径
/app1
的链接时,我希望它的URL是
external.company.ca/app1
,内容来自
internal.company.ca/some_app
。相反,浏览器将直接进入
internal.company.ca/some\u app

没有302什么的,就直接到那里。这对我来说很奇怪,因为除了反向代理配置,配置中没有提到
internal.company.ca
,所以我根本不知道浏览器是如何了解域的

这是一个从客户端(浏览器)角度拍摄的小提琴手抓拍,显示了我点击链接到
/app1
(你必须相信我,绿色名称是
external.company.ca
,黑色名称是
internal.company.com
,路径是
/some\u 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>

#将规则改写为443
ServerName external.company.ca
ServerAlias external.company.com
#日志记录规则。。。。。。。。。
斯伦金安
SSLProxyEngine打开
SSLProxyVerify无
#大部分都是出于测试目的而关闭的,以防出现问题
SSLProxyCheckPeerCN关闭
SSLProxyCheckPeerName关闭
SSLProxycheckpeer关闭
#更多SSL内容。。。。现在进入有趣的部分
代理主机
ProxyPass/app1https://internal.company.com/some_app
ProxyPassReverse/app1https://internal.company.com/some_app
在某一点上,我认为可能是cookies在扔东西,因为它们位于不同的域(.ca在前面,.com在后面),但我相信如果反向代理工作正常,浏览器将不会更明智。有人看到上面有什么问题吗

更新

我找到了罪犯:

window.location.assign('https://internal.company.com/app1/login?redirectUrl='+encodeURIComponent(window.location.pathname+window.location.hash))

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


内部应用程序是由供应商提供的,尽管可能会对其进行修改以删除上述代码,但我还是希望暂时不要使用这种方法,看看是否有替代方法。

我想出了一个有点棘手的解决办法:

ProxyHTMLEnable On
ProxyHTMLExtended On
ProxyHTMLLinks script src
ProxyHTMLURLMap https://internal.company.com
问题是在来自供应商应用程序的整个HTML(和javascript)中使用绝对URL。搜索和删除域可以解决问题(但速度非常慢)


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

一个可能更安全的解决方案是使用。你也可以考虑,但在它的替代品中可能会相当残酷,偶尔会打破JavaScript。
编辑:刚刚注意到您当前正在使用ProxyHtmlexted。我的错。正如您所强调的,这是一个非常残酷和危险的问题解决方案。

如果您查看链接的原始html,链接是否会显示>?您可能需要查看代理html(我认为这就是模块)来重写html以删除对内部URL的引用(可能取决于您对站点的控制程度……sharepoint在这方面非常棒),html是
。在幕后也发生了SSO;internal.company.com正在读取包含用户授权的cookie。我在想这就是问题的症结所在。我将研究proxy_html。