2017-03-17 73 views
0

我的第一次尝试是在Express中制作一个反向代理,它允许我请求localhost:3000/request并将其转发到somesite.com/request进行跨域请求,同时保留原始IP地址

我的代码是:

var request = require('request'); 
app.get('/', function(req,res) { 
    var newurl = 'http://google.com/'; 
    request(newurl).pipe(res); 
}); 

这个问题这一点,是它改变了请求的IP地址,到我的服务器的IP。

我的下一个尝试是JSONP,即使这是一个HTML网页,而不是一个JSON文件。

var tag = document.createElement("script"); 
tag.src = 'http://example.com/search?q=test'; 

document.getElementsByTagName("head")[0].appendChild(tag); 

的错误,这是:Uncaught SyntaxError: Unexpected token <

+0

是的,如果您从服务器向另一台服务器发出请求,那么当然,请求到其他服务器的请求的IP地址来自您的服务器。你还会期待什么? A到B的请求将显示它来自A的IP地址。 – jfriend00

+0

实际上,如果通信将返回到Express服务器,那么根据定义,请求来自的IP地址必须是您的Express服务器以便数据可以发回到Express服务器的IP地址。 – jfriend00

+0

@ jfriend00我希望将传入的IP地址传递给我的Web服务器。我以为我必须像CloudFlare那样传递自定义标题。 https://easyengine.io/tutorials/nginx/forwarding-visitors-real-ip/ – User

回答

1

你肯定能避开与服务器端代理CORS。您可以使用像node-http-proxy这样的预建模块来完成该任务,并为您处理大部分实施。

但是,目标目标站点将看到来自您的代理服务器的IP地址的请求,并且您无法更改该请求。

正确的代理会将标头插入原始HTTP请求中,该请求包含原始浏览器的IP地址,并且接收服务器可以查看这些额外的标头(如果它选择的话)。但是,如果它只查看请求实际来自的IP地址,那么它会看到您的代理服务器的IP地址,您无法更改该IP地址。要使数据从代理服务器流向目标目标服务器,然后请求通过代理服务器返回到原始浏览器,则服务器与目标目标服务器之间必须存在TCP连接,并且源IP地址必须成为你的服务器(这是数据可以流回服务器的唯一方式,因此你可以将它转发回浏览器)。对于JSONP,JSONP需要来自目标服务器的协作支持(所请求的数据必须在一段JavaScript中发回,当运行时将调用所需的回调函数)。如果该服务器没有明确支持JSONP,那么你就不能使用它。

+0

我可以创建一个Flash应用程序或类似的请求权限来运行并进行异地请求吗? – User

+1

@用户 - 通过在目标站点上托管适当的crossdomain.xml文件,目标站点(您想要发送请求的目标站点)必须打开自身以跨越源Flash请求。一些细节[这里](http://www.adobe.com/devnet/articles/crossdomain_policy_file_spec.html)和[这里](http://stackoverflow.com/questions/213251/can-someone-post-a-well -formed-跨域-XML的样品)。 – jfriend00

+0

我可以在网站上嵌入另一种类型的应用程序来抓取它吗? Java小程序? – User