Apache反向代理:如何将外部站点中的相对URL重定向回自身?

时间:2012-11-04 15:06:54

标签: apache cross-domain mod-proxy cross-domain-proxy

我需要绕过跨站点脚本限制,以便在用户点击我在iframe(external.com/onlyforme)中加载的外部站点的链接时向用户显示地图。我了解到,最简单的方法是设置反向代理,以便Apache在访问local.com/external时检索external.com/onlyforme,并使其显示为来自我的域。< / p>

这主要有效,但是当external.com/onlyforme/index.html尝试访问external.com/onlyforme/site_media/script.js时,会被重定向到local.com/site_media/script.js,这不是我想要的是。相反,我希望将其重定向到external.com/onlyforme中的正确URL,以便外部站点按预期工作。

我该怎么做?

我在httpd.conf中有这个,在任何其他配置语句之外:

ProxyRequests Off
ProxyPass /external/ http://www.external.com/onlyforme
ProxyPassReverse /external/ http://www.external.com/onlyforme

我正在运行Apache 2.2。

2 个答案:

答案 0 :(得分:2)

您需要在上面添加几个ProxyHTMLURLMap指令,以检查并重写返回的HTML中的任何硬编码URL,例如

ProxyRequests Off
ProxyPass        /external/         http://www.external.com/onlyforme
ProxyHTMLURLMap http://www.external.com/onlyforme     /external

<Location /external/>
  ProxyPassReverse  http://www.external.com/onlyforme
  SetOutputFilter proxy-html
  ProxyHTMLURLMap /            /external/
  ProxyHTMLURLMap /site_media  /external/site_media/
</Location>

另请参阅:http://wiki.uniformserver.com/index.php/Reverse_Proxy_Server:_mod_proxy_html

答案 1 :(得分:0)

arober11的回答极大地帮助解决了我的类似问题。我试图将其缩小到可能的最短规则,并且我有自己的配置,Etherpad运行https://my-domain-name.wtf/pad

<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]