Özellikle düğüm için, olay bağlantısı altında http sunucusu bileşeninin belgeleri şöyle diyor:
Yeni bir TCP akışı kurulduğunda [Tetiklendi]. [] Soketi net.Socket türünde bir nesnedir. Genellikle kullanıcılar bu etkinliğe erişmek istemez. Özellikle, protokol ayrıştırıcısının sokete nasıl bağlandığı nedeniyle soket okunabilir olaylar yayınlamaz. Sokete adresinden de erişilebilir request.connection
.
Yani, bu request.connection
bir soket anlamına gelir ve belgelere göre gerçekten de belgelere göre bir socket.remoteAddress özniteliği vardır:
Uzak IP adresinin dize ile temsil edilen hali. Örneğin, '74 .125.127.100 'veya' 2001: 4860: a005 :: 68 '.
Ekspres altında, istek nesnesi de Node http istek nesnesinin bir örneğidir, bu nedenle bu yaklaşım yine de çalışmalıdır.
Ancak, Express.js altında isteğin zaten iki özelliği vardır: req.ip ve req.ips
req.ip
Uzak adresi veya "güven proxy'si" etkinleştirildiğinde - yukarı akış adresi.
req.ips
Ne zaman "güven vekil" olduğunu true
, "X-Forward-For" ip adres listesi ayrıştırmak ve bir dizi, aksi boş bir dizi döndürülür dönün. Örneğin, değer "istemci, proxy1, proxy2" olsaydı, "proxy2" en uzak aşağı akış olan ["istemci", "proxy1", "proxy2"] dizisini alırsınız.
Bu değer, benim anlayışıma göre, Ekspres söz olabilir req.ip
daha iyi bir yaklaşımdır req.connection.remoteAddress
, çünkü req.ip
gerçek müşteri ip içeren diğer proxy IP adresini içerebilir, oysa varsa ((güvenilen vekil express etkin olması koşuluyla) bir).
Şu anda kabul edilen cevabın bu nedenle şunu öne sürmesinin nedeni:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress;
req.headers['x-forwarded-for']
Express eşdeğer olacaktır req.ip
.