apache mod_proxy 或 mod_rewrite 用于隐藏路径后面的 Web 服务器的根目录

apache mod_proxy 或 mod_rewrite 用于隐藏路径后面的 Web 服务器的根目录

我有 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>

相关内容