2016-07-27 37 views

回答

3

req.ip會盡量同時考慮到由指示請求的來源(客戶端)(代理服務器設置,儘管這隻會做,如果trust proxy設定明確啓用帳戶標題來解決實際的客戶機IP地址)。

req.connection.remoteAddress將包含發出請求的客戶端的IP地址,在代理服務器的情況下,該代理服務器將是代理的IP地址,而不是代理服務器代表其轉發請求的客戶端的IP地址。

如果您使用的是將請求轉發到Express服務器的逆向代理,則req.ip和啓用trust proxy是最佳解決方案。否則,只是簡單的req.ip仍然會這樣做。讓用戶IP

2

最好的辦法是req.headers['x-forwarded-for'] || req.connection.remoteAddress;

這樣var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;

,因爲可能是你將使用的中間件(或最常用的代理),出於安全原因,服務器(如CloudFlare的),如果你使用req.connection.remoteAddress它會每次發送中間件服務器的IP地址,但是您可以一起使用x-forwarded-for標頭和req.connection.remoteAddressreq.ip

更多信息,請閱讀有關x-forwarded-for http header

編輯

在下面的評論使用req.ip || req.connection.remoteAddress最佳實踐提及;因爲即使您在沒有代理的情況下使用應用程序,將來也可以將其與代理一起使用,並使用上述方法,您可以在不更改它的情況下使用應用程序

+0

我沒有使用代理服務器,所以如果不使用我應該使用的代理服務器,以及如果將來使用代理服務器,我應該使用哪一個? (如果您可以編輯您的答案以適應我剛剛提出的問題,將有助於未來遇到同樣問題的人員。) – guyforlowbro

+0

@guyforlowbro,爲清晰起見進行更新。 –

+0

但要小心,據我瞭解,'x-forwaded-for'標頭可能包含多個ip(如果您的快速應用程序位於代理之後)。所以我想堅持'req.ip'是要走的路 – lascort