当我尝试将 apache 2.2 配置为代理反向时遇到问题。
我的后端服务器上正在运行一个应用程序http://internal.mydomain.com/App1/
,目前这个 URL 将是$URL
,因为我是这里的新手,我无法在我的第一个帖子中发布超过 2 个 URL。
如果在我的代理服务器上使用以下配置,一切都正常
UseCanonicalName off
UseCanonicalPhysicalPort off
ProxyPreserveHost On
ProxyPassReverseCookieDomain internal.mydomain.com external.mydomain.com
ProxyPass /App1/ $URL connectiontimeout=10 timeout=60
ProxyPassReverse /App1/ $URL
访问的 URL 是external.mydomain.com/App1/
但是我的老板希望为此设置一个不同的 URL,例如external.mydomain.com/my/app1/
,所以我尝试了以下配置
UseCanonicalName off
UseCanonicalPhysicalPort off
ProxyPreserveHost On
ProxyPassReverseCookieDomain internal.mydomain.com external.mydomain.com
ProxyPass /my/app1/ $URL connectiontimeout=10 timeout=60
ProxyPassReverse /my/app1/ $URL
这应该可以工作,但是当我加载网页时,后端服务器正在回答这个问题
Cache-Control: private
Content-Type: text/html; charset=utf-8
Location: /App1/StartPage.aspx
Server: Microsoft-IIS/8.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
X-UA-Compatible: IE=edge
Date: Tue, 16 Aug 2016 21:25:01 GMT
Content-Length: 144
//<html><head><title>Object moved</title></head><body>
//<h2>Object moved to <a href="/App1/StartPage.aspx">here</a>.</h2>
//</body></html>
所以,我的问题是,有没有办法动态重写来自后端的任何内容?
答案1
ProxyPassReverse 应该使您能够更正后端服务器返回的任何 Location、Content-Location 或 URI HTTP 标头。
当你的老板希望你使用与底层应用程序部署路径不同的 URI 路径进行 ProxyPass 时,这些可能会变得有点棘手。在新的路径下部署底层应用程序(在本例中为 /my/app1/)要稳定得多。如果你的老板坚持,并且您无法更改部署路径,那么您将需要不同的 ProxyPassReverse 行。如下所示:
ProxyPass /my/app1/ http://internal.mydomain.com/App1/ ProxyPassReverse /App1/ /my/app1/
如果后端服务器的 HTML 中有需要修改的链接,那么您需要升级到 Apache httpd v2.4 并使用 mod_proxy_html 或者使用 mod_sed 或 mod_substitute 来修复有问题的 URL。