如何configurationApache的mod_proxy_html作为一个Ajax代理?

我试图build立一个网站,让您查看和操纵任何其他网站的任何网页的数据。 要做到这一点,我必须绕过“ Allow Origin ”的问题:我加载其他域的内容在iframe ,我必须从我的域下载的JavaScript操纵其内容。

我的第一个尝试是自己编写一个简单的代理,通过一个以Java编码的服务器代理来请求其他域的页面,它不仅服务于内容,而且还重build内容中的链接(src和href),以便这些链接所引用的内容得到通过我的手工代理下载。 结果是不错,但在css和脚本中的URL的问题。

那么,我意识到mod_proxy_html应该完成所有这些工作。 问题是,我不知道如何使其按预期工作。

让我们假设我的服务器运行在my-domain.com,并代理和转换来自另一个域的内容我会提出这样的请求:

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

我希望mod_proxy_html提供内容,并通过以下方式在http://another-domain.com/some/content中重写以下URL:

  1. 不是来自another-domain.com绝对url:不重写
  2. 相对于根url: /other/content – > /proxy?url=http://another-domain.com/other/content
  3. 相关url: 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应该在运行时指定,而不是configuration时间。

这可以通过mod_proxy_html来实现吗? 任何人都可以提供一个简单的工作configuration开始?

编辑1-第一种方法

下面的网站configuration可以正常使用绝对url的网站,比如http://www.huffingtonpost.es/ 。 你可以试试这个configuration在本地主机上: 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上。 所以我应该改变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> 

…似乎没有工作。 意见,提示和想法欢迎!

这里有一个关于如何做到这一点的想法 – 这在设置上稍微复杂一点,但是我认为这会很安全。 我目前无法testing,因为我无法访问我的testing服务器,但这是一个开始。

主要的问题是,如果你只是设置一个ProxyPassReverse,你还需要指定你连接的服务器。 既然你希望能够在多台服务器上使用这个,那么把它稍微放一点就太麻烦了。 所以这里有一个两步走的方法来整齐地回避这个问题。

首先,设置一个单独的apache实例,只在127.0.0.1和一个特定的端口上侦听 – 在我的例子中,我已经去了2323。 这个实例应该configuration成一个简单的代理服务器,不要重写。 例:

 <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实例。 再一次请注意,这是未经testing的,但我认为这是开始寻找的正确方向。