नोड.जेएस एक्सप्रेस में वर्तमान अनुरोध के होस्टनाम प्राप्त करें


175

इसलिए, मुझे यहाँ कुछ सरल याद आ रहा है, लेकिन मुझे होस्टनाम प्राप्त करने का कोई तरीका नहीं मिल रहा है कि एक अनुरोध ऑब्जेक्ट जिसे मैं एक प्रतिक्रिया भेज रहा हूं वह अनुरोध किया गया था।

क्या यह पता लगाना संभव है कि उपयोगकर्ता वर्तमान में नोड.जेएस से किस होस्टनाम का दौरा कर रहा है?


यह अनुरोध हेडर में है। वैसे मैंने ऐसा सोचा था, लेकिन अब मैं इसे नहीं देखता ...
हम्मम

8
CJohn ने पाया, यह request.headers.hostधन्यवाद है!
जेसी

ऐसा सोचा ... बस इसे ओले नोगिन से बाहर नहीं निकाल रहा था। खुशी है कि आप इसे मिल गए!
jcolebrand

@ जेसे अरे, यह वास्तव में सही नहीं है। request.headers.host OS पर आधारित सर्वर का होस्टनाम नहीं है, यह होस्ट हेडर नाम है जिसे HTTP अनुरोध के साथ भेजा गया है। यदि आपका सर्वर होस्ट हेडर की परवाह किए बिना किसी HTTP रिक्वेस्ट पर प्रतिक्रिया देता है, तो वह मूल्य कुछ भी हो सकता है जिसे क्लाइंट भेजने का फैसला करता है।
रॉब इवांस

@RobEvans - यदि आप प्रश्न की अंतिम पंक्ति पढ़ते हैं, तो ठीक वही है जो मैं खोज रहा था। एक नकली hostname हैडर भेजने वाला क्लाइंट एक विचित्र उपयोग का मामला है जिसे मैं व्यक्तिगत रूप से समर्थन करने की कोशिश करने के बारे में चिंता नहीं करूंगा।
जेसी

जवाबों:


198

यदि आप HTTP अनुरोध के बारे में बात कर रहे हैं, तो आप अनुरोध होस्ट को इसमें पा सकते हैं:

request.headers.host

लेकिन यह एक आने वाले अनुरोध पर निर्भर करता है।

Http://nodejs.org/docs/v0.4.12/api/http.html#http.ServerSequest पर अधिक

यदि आप मशीन / देशी जानकारी खोज रहे हैं, तो प्रक्रिया ऑब्जेक्ट आज़माएँ।


6
आह, भयानक - एफडब्ल्यूआईडब्ल्यू, अनुरोध के बिना वास्तविक मेजबान का पता लगाने का कोई तरीका नहीं होगा, आपके पास कई होस्ट कॉन्फ़िगर हो सकते हैं, लेकिन यह वही है जो मैं देख रहा था!
जेसी

2
चाल चली, धन्यवाद! एक्सप्रेस 4 में, मुझे यह अपडेट करना पड़ा: req.headers.host
जीन बो

5
गलत! request.headers.hostरिटर्न http://127.0.0.1लेकिन प्रोडक्शन सर्वर डोमेन नाम नहीं
ग्रीन

10
req.headers.hostउपयोगकर्ता द्वारा प्रदान की जाती है। मैं अजगर की 1 पंक्ति में एक अनुरोध को तैयार कर सकता हूं और आपको उस क्षेत्र के बिना अपना कोड भेजने का अनुरोध कर सकता हूं
arboreal84

1
request.headers.host अब हटा दिया गया है, इसके बजाय आप request.headers.hostname का उपयोग कर सकते हैं
Syam Danda

281

आप ओएस मॉड्यूल का उपयोग कर सकते हैं:

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

Http://nodejs.org/docs/latest/api/os.html#os_os_hostname देखें

चेतावनियां:

  1. यदि आप आईपी पते के साथ काम कर सकते हैं - मशीनों में कई नेटवर्क कार्ड हो सकते हैं और जब तक आप यह निर्दिष्ट नहीं करते हैं कि नोड उन सभी को सुनेगा, तो आपको यह नहीं पता होगा कि एनआईसी किस अनुरोध पर आया था, इसमें आने से पहले।

  2. होस्टनाम एक DNS मामला है - यह मत भूलो कि कई DNS उपनाम एक ही मशीन को इंगित कर सकते हैं।


6
यद्यपि यह मशीन के होस्टनाम को प्राप्त करने के लिए काम करेगा, मेरे पास कई मेजबानों को जवाब देने के लिए एक मशीन हो सकती है, इसलिए यह सटीक नहीं होगा।
जेसी

7
हालांकि यह एक बेहतर है - क्योंकि आप इसे उन मॉड्यूल में उपयोग कर सकते हैं जो हमेशा HTTP ऐप के संदर्भ में नहीं चलते हैं
रैडगैस्ट द ब्राउन

8
और महत्वपूर्ण रूप से यह एक प्रश्न का उत्तर देता है जैसा कि लिखा गया था। मुझे लगता है कि अगर यह जवाब नहीं है तो सवाल वास्तव में गलत है।
रोब इवांस

3
यह उस hostnameकमांड से संबंधित है जो एक मान्य DNS नाम होना चाहिए लेकिन होना आवश्यक नहीं है। उदाहरण के लिए, OS X के तहत आपको ऐसे नाम मिलेंगे my-machine.localजो DNS के साथ हल करने योग्य नहीं हैं। मशीन के बाहरी आईपी का पता लगाने के लिए आपको एक सेवा को हिट करना होगा जो इस फ़ंक्शन को करता है या इसे पता लगाने के लिए STUN प्रोटोकॉल का उपयोग करता है।
तदम

6
यह हमेशा सटीक होता है। यह मशीन के होस्टनाम को लौटाता है, जो कि सवाल का शीर्षक है। (इस का पाठ एक अलग प्रश्न पूछा गया)। आने वाले HTTP अनुरोध पर होस्टनाम का उपयोग एक अलग मामला है।
चेसो

18

यहाँ एक वैकल्पिक है

req.hostname

एक्सप्रेस डॉक्स में इसके बारे में पढ़ें ।


1
यह सही उत्तर है, जैसा कि req.headers.host होस्ट देता है: port
ekerner

क्या req.hostname और req.host के बीच अलग है
RayLoveless

1
req.host को पदावनत कर दिया गया है। यदि आप उस का उपयोग करते हैं, तो एक्सप्रेस एक चेतावनी को आउटपुट करेगा 'पदावनत req.host: इसके बजाय req.hostname का उपयोग करें'
bruceczk

8

यदि आपको पूरी तरह से योग्य डोमेन नाम की आवश्यकता है और लिनक्स पर कोई HTTP अनुरोध नहीं है, तो आप उपयोग कर सकते हैं:

var child_process = require("child_process");

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

1
BTW hostnameविंडोज में भी कमांड है (लेकिन आप इसे मापदंडों के बिना लागू करते हैं)
jakub.g

7

सबसे पहले, एक उत्तर प्रदान करने से पहले मैं इस तथ्य के बारे में अग्रिम होना चाहूंगा कि हेडर पर भरोसा करके आप फ़िशिंग जैसी सुरक्षा कमजोरियों के लिए द्वार खोल रहे हैं। इसलिए पुनर्निर्देशन के उद्देश्यों के लिए, URL को अधिकृत किए बिना पहले हेडर से मूल्यों का उपयोग न करें।

फिर, आपका ऑपरेटिंग सिस्टम होस्टनाम जरूरी DNS एक से मेल नहीं खा सकता है। वास्तव में, एक आईपी में एक से अधिक DNS नाम हो सकते हैं। तो HTTP के प्रयोजनों के लिए इस बात की कोई गारंटी नहीं है कि आपके ऑपरेटिंग सिस्टम कॉन्फ़िगरेशन में आपकी मशीन को होस्टनाम दिया गया है जो प्रयोग करने योग्य है।

सबसे अच्छा विकल्प मैं सोच सकता हूं कि आपके HTTP श्रोता सार्वजनिक आईपी प्राप्त करें और DNS के माध्यम से इसका नाम हल करें। dns.reverseअधिक जानकारी के लिए विधि देखें । लेकिन फिर, फिर से ध्यान दें कि एक आईपी में कई नाम जुड़े हो सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.