2011-09-21 15 views
135

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

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

+0

यह अनुरोध शीर्षलेख में है। खैर मैंने ऐसा सोचा लेकिन अब मुझे यह नहीं दिख रहा है ... हम्मम्म – jcolebrand

+8

सीजोहन ने पाया, यह 'request.headers.host' में है - धन्यवाद! – Jesse

+0

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

उत्तर

138

आप एक HTTP अनुरोध के बारे में बात कर रहे हैं, तो आप में अनुरोध मेजबान पा सकते हैं:

request.headers.host 

लेकिन वह एक इनकमिंग अनुरोध पर निर्भर करता है।

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

पर अधिक आप मशीन/देशी जानकारी के लिए देख रहे हैं, तो प्रक्रिया वस्तु का प्रयास करें।

+5

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

+2

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

+2

गलत! 'request.headers.host' रिटर्न' http: // 127.0.0.1' लेकिन उत्पादन सर्वर डोमेन नाम – Green

260

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

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

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

चेतावनियां:

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

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

+6

का उपयोग कर सकते हैं हालांकि यह मशीन के लिए काम करेगा होस्टनाम, मैं एकाधिक होस्टों के जवाब देने के लिए एक मशीन सेट अप कर सकता हूं, इसलिए यह सटीक नहीं होगा। – Jesse

+7

हालांकि यह एक बेहतर है - क्योंकि आप इसे मॉड्यूल में उपयोग कर सकते हैं जो हमेशा HTTP ऐप –

+8

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

7

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

var child_process = require("child_process"); 

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

बीटीडब्ल्यू विंडोज में 'होस्टनाम' कमांड भी है (लेकिन आप पैरामीटर के बिना इसे आमंत्रित करते हैं) –

4

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

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

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

0

यहाँ Express Docs में इसके बारे में एक वैकल्पिक

req.hostname 

पढ़ें है।

संबंधित मुद्दे