代理网站的内部实现,如kproxy

时间:2014-10-20 12:08:03

标签: proxy http-proxy proxy-server webproxy

我想实现像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一样的功能呢?并仅通过我的服务器代理所有流量。

1 个答案:

答案 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