2017-03-17 46 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