如何配置 apache 的 mod_proxy_html 以作为 ajax 代理工作?

如何配置 apache 的 mod_proxy_html 以作为 ajax 代理工作?

我正在尝试构建一个网站,让您可以查看和操作任何其他网站中任何页面的数据。要做到这一点,我必须绕过“ Allow Origin”问题:我正在加载其他域的内容,iframe 并且必须使用从我的域下载的 javascript 来操作其内容。

我的第一个尝试是自己编写一个简单的代理,通过用 Java 编写的服务器代理请求其他域的页面,该代理不仅提供内容,还重建内容中的链接(src 和 href),以便这些链接引用的内容也通过我手工制作的代理下载。结果还不错,但 css 和脚本中的 url 存在问题。

就在那时我意识到它mod_proxy_html应该完成所有这些工作。问题是我不知道如何让它按预期工作。

假设我的服务器在 my-domain.com 上运行,并且为了代理和转换来自另一个域的内容,我会发出如下请求:

my-domain.com/proxy?url=http://another-domain.com/some/content

我想要通过以下方式mod_proxy_html提供内容并重写以下 URL :http://another-domain.com/some/content

  1. 绝对 URL 不是来自another-domain.com: 不重写
  2. 相对于根 URL:/other/content->/proxy?url=http://another-domain.com/other/content
  3. 相对网址:other/content->/proxy?url=http://another-domain.com/some/content/other/content
  4. 相对于父级 URL:../other/content->/proxy?url=http://another-domain.com/some/other/content

应该在运行时指定 URL,而不是配置时。

可以使用 mod_proxy_html 实现吗?有人可以提供一个简单的工作配置吗?

编辑 1-第一种方法

以下站点配置适用于使用绝对 URL 的站点,例如http://www.huffingtonpost.es/。您可以在 localhost 上尝试此配置:http://localhost/asset/http://www.huffingtonpost.es/

<VirtualHost *:80>
    ServerName localhost

    LogLevel debug

    ProxyRequests off
    RewriteEngine On
    RewriteRule ^/asset/(.*) $1 [P]
    ProxyHTMLURLMap $1 /asset/


    <Location /asset/>
            ProxyPassReverse /
        ProxyHTMLURLMap / /asset/
    </Location>
</VirtualHost>

但正如文档,如果我使用相对 URL 访问网站,我希望通过 mod_proxy_html 在 html 上重写这些 URL。因此,我应该Location按如下方式更改块:

    <Location /asset/>
            ProxyPassReverse /

            #Depending on your system use one line or the other
            #Ubuntu:
            #SetOutputFilter proxy-html
            #any other system:
            ProxyHTMLEnable On 

        ProxyHTMLURLMap / /asset/
    </Location>

...似乎不起作用。欢迎发表评论、提示和想法!

答案1

以下是关于如何做到这一点的想法 - 设置起来有点复杂,但我认为它会很安全。我目前无法测试这一点,因为我无法访问我的测试服务器,但这只是一个开始。

主要问题是,如果您只设置了 ProxyPassReverse,您还需要指定要连接到哪些服务器。由于您希望能够在多台服务器上使用它,因此这有点麻烦,说得客气一点。因此,这里有一个两步方法可以巧妙地避开这个问题。

首先,设置一个单独的 apache 实例,仅监听 127.0.0.1 和特定端口 - 在我的示例中,我使用了 2323。此实例应配置为直接代理服务器,不进行重写。示例:

<Proxy *>
   Order Deny,Allow
   Deny from all
   Allow from 127.0.0.1
</Proxy> 

在你的主服务器上,设置一个反向代理,如下所示:

<Location /proxy/>
    ProxyPass http://127.0.0.1:2323
    ProxyPreserveHost On
    ProxyHtmlEnable ON
    ProxyHtmlMap / /proxy/
</Location> 

这意味着实际的代理工作方式与常规代理相同,而重写发生在脚本运行的同一 apache 实例中。再次注意,这尚未经过测试,但我认为这是开始研究的正确方向。

相关内容