Node.js Express'te mevcut isteğin ana bilgisayar adını alın


175

Yani, burada basit bir şey eksik olabilir, ancak yanıt gönderdiğim bir istek nesnesinin istendiği ana bilgisayar adını almak için bir yol bulamıyorum.

Kullanıcının şu anda node.js adresinden hangi ana bilgisayar adını ziyaret ettiğini bulmak mümkün mü?


İstek başlıklarında. Peki ben öyle düşündüm ama şimdi görmüyorum ... hmmmm
jcolebrand 21:11

8
CJohn buldu, içeri request.headers.host- teşekkürler!
Jesse

Öyle sanıyordum ... onu ole noggin'den çekmiyordu. Anladığınıza sevindim!
jcolebrand

@Jesse Hey, bu aslında doğru değil. request.headers.host, işletim sistemine bağlı olarak sunucunun ana bilgisayar adı değil, HTTP isteği ile birlikte gönderilen ana bilgisayar üstbilgi adıdır. Sunucunuz ana bilgisayar üstbilgisine bakılmaksızın herhangi bir HTTP isteğine yanıt verirse, bu değer istemcinin göndermeye karar verdiği HERHANGİ BİR şey olabilir.
Rob Evans

@RobEvans - Sorunun son satırını okursanız, tam da aradığım şey buydu. Sahte bir ana bilgisayar adı üstbilgisi gönderen bir müşteri, kişisel olarak desteklemeye çalışmaktan endişe etmeyeceğim tuhaf bir kullanım durumudur.
Jesse

Yanıtlar:


198

Bir HTTP isteğinden bahsediyorsanız, istek ana bilgisayarını şu adreste bulabilirsiniz:

request.headers.host

Ancak bu gelen bir talebe dayanır.

Daha fazla bilgi için http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerRequest

Makine / yerel bilgi arıyorsanız, işlem nesnesini deneyin.


6
Ah, harika - FWIW, gerçek ana bilgisayarı bir istek olmadan tespit etmenin bir yolu olmazdı, yapılandırılmış birden fazla ana makineye sahip olabilirsiniz, ama bu aradığım şey!
Jesse

2
Hile yaptın, teşekkürler! Express 4'te, bu güncellemeyi yapmak zorunda kaldım: req.headers.host
Gene Bo

5
Yanlış! bir üretim sunucusu etki alanı adını request.headers.hostdöndürür, http://127.0.0.1ancak döndürmez
Green

10
req.headers.hostkullanıcı tarafından sağlanır. Python'un 1 satırında bir istekte bulunabilir ve bu alanı kodunuzun çökmesine neden olmadan size bir istek gönderebilirim
arboreal84

1
request.headers.host artık kullanımdan kaldırıldı, bunun yerine request.headers.hostname
Syam Danda

281

OS Modülünü kullanabilirsiniz:

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

Bkz. Http://nodejs.org/docs/latest/api/os.html#os_os_hostname

Uyarılar:

  1. IP adresiyle çalışabiliyorsanız - Makinelerin birkaç Ağ Kartı olabilir ve siz belirtmedikçe düğümün hepsini dinler, böylece isteğin gelmeden önce hangi NIC'in geldiğini bilmezsiniz.

  2. Ana bilgisayar adı bir DNS sorunudur - Birkaç DNS diğer adının aynı makineyi gösterebileceğini unutmayın.


6
Bu, makinenin ana bilgisayar adını almak için çalışacak olsa da, birden fazla ana bilgisayara yanıt vermek için ayarlanmış bir makinem olabilir, bu yüzden bu doğru olmaz.
Jesse

7
Ancak bu daha iyidir - çünkü her zaman HTTP uygulaması bağlamında çalışmayan modüllerde kullanabilirsiniz
Radagast the Brown

8
Ve daha da önemlisi, bu soruyu yazıldığı gibi cevaplıyor. Cevap bu değilse, sorunun aslında yanlış olduğunu düşünüyorum.
Rob Evans

3
Bu, geçerli bir DNS adı olması gereken ancak olması gerekmeyen hostnamekomutla ilişkilidir . Örneğin, OS X altında , DNS ile çözümlenemeyen adlar alırsınız . Makinenin harici IP'sini anlamak için, bu işlevi gerçekleştiren bir hizmete basmanız veya bunu anlamak için STUN protokolünü kullanmanız gerekir. my-machine.local
tadman

6
Bu her zaman doğrudur. Sorunun başlığı sorulan makinenin ana bilgisayar adını döndürür. (Bunun metni farklı bir soru sordu). Gelen bir HTTP isteğinde kullanılan ana bilgisayar adı farklı bir konudur.
Cheeso

18

İşte bir alternatif

req.hostname

Ekspres Dokümanlar'da bunun hakkında bilgi edinin .


1
Req.headers.host ev sahibi verir: doğru cevap budur: port
ekerner

req.hostname ve req.host arasındaki fark nedir
RayLoveless

1
req.host kullanımdan kaldırıldı. Bunu kullanırsanız, ekspres 'kullanımdan kaldırılmış req.host: Bunun yerine req.hostname kullan' yazan bir uyarı verir
bruceczk

8

Tam etki alanı adına ihtiyacınız varsa ve HTTP isteğiniz yoksa, Linux'ta şunları kullanabilirsiniz:

var child_process = require("child_process");

child_process.exec("hostname -f", function(err, stdout, stderr) {
  var hostname = stdout.trim();
});

1
BTW hostnameWindows'da da komut var (ancak parametreler olmadan çağırıyorsunuz)
jakub.g

7

Her şeyden önce, bir cevap vermeden önce, başlıklara güvenerek kimlik avı gibi güvenlik açıklarının kapısını açtığınızdan emin olmak istiyorum. Bu nedenle, yeniden yönlendirme amacıyla, önce URL'yi onaylamadan başlıklardan gelen değerleri kullanmayın.

Ardından, işletim sistemi ana makine adınız DNS ile eşleşmeyebilir. Aslında, bir IP'nin birden fazla DNS adı olabilir. HTTP amaçları için, işletim sistemi yapılandırmanızda makinenize atanan ana bilgisayar adının kullanılabilir olduğuna dair bir garanti yoktur.

Aklıma gelen en iyi seçenek, HTTP dinleyicinizin genel IP adresini almak ve adını DNS aracılığıyla çözümlemektir. Daha dns.reversefazla bilgi için yönteme bakın . Ancak, yine, bir IP'nin kendisiyle ilişkili birden fazla adı olabileceğini unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.