Dapatkan nama host dari permintaan saat ini di node.js Express

175

Jadi, saya mungkin kehilangan sesuatu yang sederhana di sini, tetapi sepertinya saya tidak dapat menemukan cara untuk mendapatkan nama host tempat objek permintaan yang saya kirimi tanggapan.

Apakah mungkin untuk mencari tahu hostname apa yang saat ini dikunjungi dari node.js?

Jesse
sumber
Ada di header permintaan. Ya saya pikir begitu tapi sekarang saya tidak melihatnya ... hmmmm
jcolebrand
8
CJohn menemukannya, itu ada di request.headers.host- terima kasih!
Jesse
Kupikir begitu ... hanya tidak menariknya keluar dari ole noggin. Senang kamu mendapatkannya!
jcolebrand
@Jesse Hei, itu sebenarnya tidak benar. request.headers.host bukan nama host dari server berdasarkan pada OS, itu adalah nama header host yang dikirim bersama dengan permintaan HTTP. Jika server Anda menanggapi permintaan HTTP apa pun terlepas dari header host maka nilai itu bisa APA SAJA yang diputuskan klien untuk dikirim.
Rob Evans
@RobEvans - Jika Anda membaca baris terakhir dari pertanyaan, itulah yang saya cari. Klien yang mengirim tajuk hostname palsu adalah kasus penggunaan yang aneh yang secara pribadi tidak akan saya khawatirkan untuk mencoba mendukungnya.
Jesse

Jawaban:

198

Jika Anda berbicara tentang permintaan HTTP, Anda dapat menemukan host permintaan di:

request.headers.host

Tapi itu bergantung pada permintaan masuk.

Lebih lanjut di http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

Jika Anda mencari informasi mesin / asli, coba objek proses.

cjohn
sumber
6
Ah, luar biasa - FWIW, tidak akan ada cara untuk mendeteksi host yang sebenarnya tanpa permintaan, Anda dapat memiliki beberapa host yang dikonfigurasi, tetapi ini adalah apa yang saya cari!
Jesse
2
Lakukan triknya, terima kasih! Di Express 4, saya harus melakukan pembaruan ini: req.headers.host
Gene Bo
5
Salah! request.headers.hostkembali http://127.0.0.1tetapi bukan nama domain server produksi
Hijau
10
req.headers.hostdisediakan oleh pengguna. Saya dapat membuat permintaan dalam 1 baris python dan mengirimi Anda permintaan tanpa bidang itu membuat kode Anda macet
arboreal84
1
request.headers.host sekarang sudah tidak digunakan lagi, sebagai gantinya Anda dapat menggunakan request.headers.hostname
Syam Danda
281

Anda dapat menggunakan Modul os:

var os = require("os");
os.hostname();

Lihat http://nodejs.org/docs/latest/api/os.html#os_os_hostname

Peringatan:

  1. jika Anda dapat bekerja dengan alamat IP - Mesin mungkin memiliki beberapa Kartu Jaringan dan kecuali Anda menentukannya, node akan mendengarkan semuanya, jadi Anda tidak tahu NIC mana yang meminta, sebelum masuk.

  2. Hostname adalah masalah DNS - Jangan lupa bahwa beberapa alias DNS dapat mengarah ke mesin yang sama.

stephenbez
sumber
6
Meskipun ini akan berfungsi untuk mendapatkan nama host mesin, saya dapat mengatur mesin untuk menjawab beberapa host, jadi ini tidak akan akurat.
Jesse
7
Namun yang ini lebih baik - karena Anda dapat menggunakannya dalam modul yang tidak berjalan selalu di dalam konteks aplikasi HTTP
Radagast the Brown
8
Dan yang penting yang ini menjawab pertanyaan seperti yang ditulis. Saya pikir pertanyaannya sebenarnya salah jika ini bukan jawabannya.
Rob Evans
3
Ini berkorelasi dengan hostnameperintah yang seharusnya merupakan nama DNS yang valid tetapi tidak harus. Misalnya, di bawah OS X Anda akan mendapatkan nama-nama seperti my-machine.localyang tidak dapat diselesaikan dengan DNS. Untuk mengetahui IP eksternal mesin Anda harus menekan layanan yang melakukan fungsi ini atau menggunakan protokol STUN untuk mengetahuinya.
tadman
6
Ini selalu akurat. Ia mengembalikan nama host mesin, yang merupakan judul pertanyaan yang ditanyakan. (Teks yang ini menanyakan pertanyaan yang berbeda). Hostname yang digunakan pada permintaan HTTP yang masuk adalah masalah yang berbeda.
Cheeso
18

Inilah alternatifnya

req.hostname

Baca tentang hal itu di Express Documents .

Eddie
sumber
1
Ini adalah jawaban yang benar, karena req.headers.host memberi host: port
ekerner
apa perbedaan antara req.hostname dan req.host
RayLoveless
1
req.host sudah tidak digunakan lagi. Jika Anda menggunakannya, express akan menampilkan peringatan yang mengatakan 'usang req.host: Gunakan req.hostname sebagai gantinya'
bruceczk
8

Jika Anda memerlukan nama domain yang sepenuhnya memenuhi syarat dan tidak memiliki permintaan HTTP, di Linux, Anda dapat menggunakan:

var child_process = require("child_process");

child_process.exec("hostname -f", function(err, stdout, stderr) {
  var hostname = stdout.trim();
});
dricket
sumber
1
BTW juga ada hostnameperintah di Windows (tetapi Anda menjalankannya tanpa parameter)
jakub.g
7

Pertama-tama, sebelum memberikan jawaban saya ingin dimuka tentang fakta bahwa dengan mempercayai header Anda membuka pintu untuk kerentanan keamanan seperti phishing. Jadi untuk tujuan pengalihan, jangan gunakan nilai dari header tanpa terlebih dahulu memvalidasi URL.

Kemudian, nama host sistem operasi Anda mungkin tidak cocok dengan yang DNS. Bahkan, satu IP mungkin memiliki lebih dari satu nama DNS. Jadi untuk tujuan HTTP tidak ada jaminan bahwa nama host yang ditetapkan untuk mesin Anda dalam konfigurasi sistem operasi Anda dapat digunakan.

Pilihan terbaik yang bisa saya pikirkan adalah untuk mendapatkan IP publik pendengar HTTP Anda dan menyelesaikan namanya melalui DNS. Lihat dns.reversemetode untuk info lebih lanjut. Namun, sekali lagi, perhatikan bahwa IP mungkin memiliki beberapa nama yang dikaitkan dengannya.

arboreal84
sumber