Khusus untuk node, dokumentasi untuk komponen server http, di bawah koneksi acara mengatakan:
[Dipicu] ketika aliran TCP baru dibuat. Soket [adalah] objek dengan tipe net. Socket. Biasanya pengguna tidak ingin mengakses acara ini. Secara khusus, soket tidak akan memancarkan peristiwa yang dapat dibaca karena cara pengurai protokol menempel ke soket. Soket juga dapat diakses di request.connection
.
Jadi, itu artinya request.connection
soket dan menurut dokumentasi memang ada atribut socket.remoteAddress yang menurut dokumentasi adalah:
Representasi string dari alamat IP jarak jauh. Misalnya, '74 .125.127.100 'atau' 2001: 4860: a005 :: 68 '.
Di bawah express, objek permintaan juga merupakan instance dari objek permintaan Node http, jadi pendekatan ini harus tetap berfungsi.
Namun, di bawah Express.js permintaan sudah memiliki dua atribut: req.ip dan req.ips
req.ip
Kembalikan alamat jarak jauh, atau ketika "trust trust" diaktifkan - alamat hulu.
req.ips
Ketika "trust proxy" adalah true
, parsing daftar alamat "X-Forwarded-For" dan kembalikan array, jika tidak, array kosong akan dikembalikan. Sebagai contoh jika nilainya "klien, proxy1, proxy2" Anda akan menerima array ["klien", "proxy1", "proxy2"] di mana "proxy2" adalah down-stream terjauh.
Mungkin perlu disebutkan bahwa, menurut pemahaman saya, Ekspres req.ip
adalah pendekatan yang lebih baik daripada req.connection.remoteAddress
, karena req.ip
berisi ip klien yang sebenarnya (asalkan proksi tepercaya diaktifkan secara ekspres), sedangkan yang lain mungkin berisi alamat IP proksi (jika ada satu).
Itulah alasan mengapa jawaban yang diterima saat ini menyarankan:
var ip = req.headers['x-forwarded-for'] ||
req.connection.remoteAddress;
Ini req.headers['x-forwarded-for']
akan menjadi setara dengan express req.ip
.