我有 2 个 apache 2.2.21,一个外部的,一个内部的,我需要将内部 apache 映射到外部 apache 中的路径后面,但是我对绝对 url 有一些问题。
我尝试了以下配置:
RewriteEngine on
RewriteRule ^/externalpath/(.*)$ http://internal-apache.test.com/$1 [L,P,QSA]
ProxyPassReverse /externalpath/ http://internal-apache.test.com/
或者
<Location /externalpath/>
ProxyPass http://internal-apache.test.com/
ProxyPassReverse http://internal-apache.test.com/
</Location>
我的内部 apache 使用绝对路径来搜索资源,如图像、css 和 html,现在我无法更改它。
有什么建议吗?谢谢
答案1
有多种替代方案:
一)重写内部应用程序以使用相对路径而不是绝对路径。
二)在子目录中而不是在内部 apache 的根目录中重新部署内部应用程序。
三)一和二通常不太可能发生...如果你很幸运,内部应用程序只使用两个或三个子目录,而这些子目录在你的主站点上未使用,只需编写一堆 ProxyPass 行:
# Expose Internal App to the internet.
ProxyPass /externalpath/ http://internal-apache.test.com/
ProxyPassReverse /externalpath/ http://internal-apache.test.com/
# Internal app uses a bunch of absolute paths.
ProxyPass /css/ http://internal-apache.test.com/css/
ProxyPassReverse /css/ http://internal-apache.test.com/css/
ProxyPass /icons/ http://internal-apache.test.com/icons/
ProxyPassReverse /icons/ http://internal-apache.test.com/icons/
四)为内部应用程序创建一个单独的子域,并简单地对所有内容进行反向代理:
<VirtualHost *:80>
ServerName app.test.com/
# Expose Internal App to the internet.
ProxyPass / http://internal-apache.test.com/
ProxyPassReverse / http://internal-apache.test.com/
</VirtualHost>
五) 有时开发人员完全没有头绪,他们的应用程序不仅生成绝对 URL,甚至还在 URL 中包含主机名部分,生成的 HTML 代码如下所示:<img src=http://internal-apache.test.com/icons/logo.png>
。
A) 您可以使用水平分割 DNS 和方案 4 的组合解决方案。内部和外部用户都使用 internal-apache.test.com 地址,但您的内部 DNS 直接指向 internal-apache.test.com 服务器的 IP 地址。对于外部用户,internal-apache.test.com 的公共记录指向您的公共 Web 服务器的 IP 地址,然后您可以使用解决方案 4。
乙)实际上,您可以让 apache 不仅代理对内部 apache 的请求,还可以在将响应主体传输给您的用户之前重写响应主体。(通常,代理仅重写 HTTP 标头/响应)。apache 2.2 中的 mod_substitute。我还没有测试它是否能与 mod_proxy 很好地叠加,但也许以下方法有效:
<Location /externalpath/>
ProxyPass http://internal-apache.test.com/
ProxyPassReverse http://internal-apache.test.com/
AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|internal-apache.test.com/|public-apache.test.com/externalpath/|i"
</Location>