我试图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:
another-domain.com
绝对url:不重写 /other/content
– > /proxy?url=http://another-domain.com/other/content
other/content
– > /proxy?url=http://another-domain.com/some/content/other/content
../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的,但我认为这是开始寻找的正确方向。