如何使用反向代理正确处理相对URL

Modified on: Thu, 18 Jul 2019 15:40:02 +0800

我在Apache中有如下的反向代理设置:

地址为www.example.com/folder的服务器A是反向代理服务器。

它映射到:服务器B,地址为test.madeupurl.com

这种作品。但我遇到的问题是,在www.example.com/folder上,所有相关链接都是www.example.com/css/examplefilename.css而不是www.example.com/folder/css/examplefilename。 CSS

我该如何解决这个问题?

到目前为止,我的反向代理在服务器A(www.example.com)上有这个:

<Location /folder>
    ProxyPass  http://test.madeupurl.com
    ProxyPassReverse http://test.madeupurl.com
</Location>

最佳答案

Apache ProxyPassRewrite不会重写从http://test.example.com收到的响应正文,标题(如重定向到404页面等)。

许多替代方案:

一个)重写内部应用以使用相对路径而不是绝对路径。即../css/style.css而不是/css/style.css

两个)将内部应用程序重新部署在相同的子目录/folder中,而不是在test.example.com的根目录中。

)一两个通常不太可能发生...如果你很幸运,内部应用程序只使用两个或三个子目录,那些在主站点上未使用,只需写一堆ProxyPass行:

# Expose Internal App to the internet.
ProxyPass /externalpath/  http://test.example.com/
ProxyPassReverse /externalpath/  http://test.example.com/
# Internal app uses a bunch of absolute paths. 
ProxyPass /css/  http://test.example.com/css/
ProxyPassReverse /css/  http://test.example.com/css/
ProxyPass /icons/  http://test.example.com/icons/
ProxyPassReverse /icons/  http://test.example.com/icons/

)为内部应用创建一个单独的子域,并简单地反向代理所有内容:

<VirtualHost *:80>
   ServerName app.example.com/
   # Expose Internal App to the internet.
   ProxyPass /  http://test.internal.example.com/
   ProxyPassReverse /  http://test.internal.example.com/
</VirtualHost>

)有时开发人员完全无能为力,让他们的应用程序不仅生成绝对URL,而且甚至在其URL中包含主机名部分,生成的HTML代码如下所示:&lt;img src=http://test.example.com/icons/logo.png&gt;

A)您可以使用水平分割DNS和方案4的组合解决方案。内部和外部用户都使用test.example.com,但您的内部DNS直接指向ip-address test.example.com的服务器。对于外部用户,test.example.com的公共记录指向公共网络服务器www.example.com的IP地址,然后您可以使用解决方案4.

B)您实际上可以获取apache,不仅可以代理对test.example.com的请求,还可以重写响应正文,然后再将其传输到您的用户。 (通常,代理仅重写HTTP标头/响应)。 apache 2.2中的mod_substitute。我没有测试它是否与mod_proxy很好地堆叠,但可能以下工作:

<Location /folder/>
  ProxyPass http://test.example.com/
  ProxyPassReverse http://test.example.com/ 
  AddOutputFilterByType SUBSTITUTE text/html
  Substitute "s|test.example.com/|www.example.com/folder/|i" 
</Location>
作者:,HBruijn

相关问答

添加新评论