![如何创建到 URL 中指定主机的反向代理?](https://linux22.com/image/688874/%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BA%E5%88%B0%20URL%20%E4%B8%AD%E6%8C%87%E5%AE%9A%E4%B8%BB%E6%9C%BA%E7%9A%84%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%EF%BC%9F.png)
我需要用 apache 配置代理来代理请求,例如
http://example.com/proxy/www.anothersite.com/[some-params]
到
http://www.anothersite.com/[some-params]
我尝试这样做:
<LocationMatch ^/proxy/(.*)$>
ProxyPassMatch http://$1
</LocationMatch>
但是,如何才能让所有发往远程主机的重定向都通过代理进行呢?例如,如果我访问 URL:
http://example.com/proxy/another-site.com
并且 another-site.com 向我发送重定向到 yet-another-site.com,它会将我的浏览器转发到
http://example.com/proxy/yet-another-site.com
答案1
您可以使用 ApacheProxyPassReverse
指令来实现这一点。您可以在以下位置找到其文档Apache 文档
答案2
我建议不要使用 Location 或 LocationMatch 块,只需使用 ProxyPass 和 ProxyPassMatch 的两个参数版本。因此,对于您的情况:
ProxyPassMatch ^/proxy/(.*)$ http://$1
但是您无法使用 Apache 配置来修复后端重定向,因为没有相应的 ProxyPassReverseMatch 指令(该指令根本无法以这种方式工作)。您需要使用 Header 指令(重复 ProxyPassReverse 指令所做的工作)编辑 Location、Content-Location 和 URI 标头,并可能使用 mod_sed/mod_substitute 来修复 HTML 中的硬编码 URL。
但这会很乱,非常乱。这种事情不容易做,因为一般来说,Apache 不是一个 HTML 内容感知服务器,而是一个 HTTP 感知服务器,这是两个完全不同的东西。
升级到 apache v2.4 可能会稍微容易一些,这样你就可以使用 mod_proxy_html(它是你可以使用 HTML 感知 (HTML intelligent) 或者用 mod_lua 或类似工具编写自己的处理程序。