如何正确使用反向代理处理相关的url

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

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

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

这种作品。 但是,我的问题是,在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收到的响应主体,只有标题(如redirect到404页面等)&#x3002;

一些替代scheme:

)重写内部应用程序使用相对path,而不是绝对的。 即../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/ 

)为内部应用程序创build一个单独的子域,并简单地反向代理一切:

 <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代码如下所示: <img src=http://test.example.com/icons/logo.png>

A )您可以使用水平分割DNS和场景4的组合解决scheme。内部和外部用户都使用test.example.com,但是您的内部DNS直接指向test.example.com服务器的IP地址。 对于外部用户,test.example.com的公共logging指向公共networking服务器www.example.com的IP地址,然后您可以使用解决scheme4。

B )你实际上可以让apache不仅向test.example.com代理请求,而且在将响应主体传送给用户之前重写响应主体 。 (通常,代理只重写HTTP头/响应)。 mod_substitute在Apache 2.2。 我没有testing,如果它与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答案的补充,如果您select解决scheme(3) “ProxyPass”,则可能还必须使用mod_proxy_html来重写HTML页面中的某些URL。

比照 如何正确使用反向代理来处理相关的url 。

作为一个应用示例,您可以使用ProxyHTMLURLMap规则来configurationApache,以将your-domain-name.com/pad中的所有内容转发到在端口9001上本地运行的Etherpad实例:

<Location /pad> ProxyPass http://localhost:9001 retry=0 # retry=0 => avoid 503's when restarting etherpad-lite ProxyPassReverse http://localhost:9001 SetOutputFilter proxy-html ProxyHTMLURLMap http://localhost:9001 </Location> RewriteRule ^/pad$ /pad/ [R]

您可以使用以下方式制作反向代理:
1.安装mod_proxy_html

  yum install mod_proxy_html 
  1. 加载mod_proxy_html模块

     LoadModule proxy_html_module modules/mod_proxy_html.so 
  2. 并使用以下设置

     ProxyRequests off ProxyPass /folder/ http://test.madeupurl.com ProxyHTMLURLMap http://test.madeupurl.com /folder <Location /folder/> ProxyPassReverse / ProxyHTMLEnable On ProxyHTMLURLMap / /folder/ RequestHeader unset Accept-Encoding </Location> 

希望这个帮助。