我想实现像kproxy.com这样的代理网站,以便我可以在我网站的iframe中加载任何网站,并从我的服务器代理网站的所有数据
我检查了他们的功能,我发现他们替换了所有脚本标签,链接(css)标签和图片标签以从他们的服务器获取内容
例如。如果原始网站包含像
这样的标签<script src="http://google.com/abc.js"></script>
他们将用
替换它<script src="http://kproxy.com/redirect/foo/bar/abc.js"></script>
我已经完成了这种功能,可以替换所有节点,以便通过我的服务器代理它们
但现在问题仍然存在于ajax调用,它将由javascript启动并将调用原始服务器,所以在我的iframe中,我有时会得到"x-frame-options = SAMEORIGIN"
错误
那么我可以做些什么来获得像kproxy一样的功能呢?并仅通过我的服务器代理所有流量。
答案 0 :(得分:1)
您的问题来自某些链接(可能是AJAX),这些链接是针对不同的域生成的。
您应该检查您为运行时构建的URL下载的脚本,如
...a="https:"==g.location.protocol?"https://csi.gstatic.com/csi":"http://csi.gstatic.com/csi");return...
(取自Google Analytics的示例)。一些jQuery applet也是如此。
此外,您应该验证某些脚本不能进行自己的AJAX调用以检索更多URL。如果他们这样做,您需要检查是否也要代理这些调用。
基本上,对于每次给您带来同源故障的电话,您需要跟踪它的来源,并指示您的代理识别并重写。
或者您可以尝试在Javascript中执行相同操作,即注入将在运行时重写这些URL的Javascript代码。例如,您可以明确检查CKEditor
// client requested a script and you, the proxy, fetched it in 'script'
if (script contains 'CKEDIT.options') {
determine init call position in script
split the script in two, A and B, before and after the init call
make 'script' equal to a new script made up of B plus C plus A concatenated
where C is the line "CKEDIT.options.url = 'http://mysite/proxy...';\n"
so that, user side, the initialization will happen with your site's address
The script will then propagate that address in lots of places without need
for you to rewrite anything else.
} else {
// script is unmodified
}
... other checks like the above...
... finally:
send 'script' to the client