Nginx वैरिएबल $ होस्ट, $ http_host और $ server_name के बीच क्या अंतर है?


42

तीन Nginx चर के बीच क्या अंतर है $host, $http_hostऔर $server_name?

मेरे पास फिर से लिखने का नियम है जहां मुझे यकीन नहीं है कि मुझे कौन सा उपयोग करना चाहिए:

location = /vb/showthread.php {
    # /vb/showthread.php?50271-What-s-happening&p=846039
    if ($arg_p) {
        return 301 $scheme://$host/forum/index.php?posts/$arg_p/;
        }

मैं एक ऐसे उत्तर की तलाश कर रहा हूं, जो आपके but rewrite rule में ___ वैरिएबल का उपयोग न करें ’कहे, बल्कि उनके बीच के सैद्धांतिक अंतर को भी स्पष्ट करे।


मुझे एहसास हुआ कि बाद में मुझे निर्दिष्ट करने की आवश्यकता नहीं थी $schemeऔर $host... return 301 /forum/index.php?posts/$arg_p/;ठीक काम करता है।
जेफ विडमैन

अधिकांश ब्राउज़र रीडायरेक्ट में रिश्तेदार URL के साथ काम करेंगे, लेकिन मानक ( w3.org/Protocols/rfc2616/rfc2616-sec14.html ) को Locationहेडर में पूर्ण यूआरएल की आवश्यकता होती है ।
शुतुलु

जवाबों:


54

आपको लगभग हमेशा उपयोग करना चाहिए $host, क्योंकि उपयोगकर्ता-एजेंट कैसे व्यवहार करते हैं, इसकी परवाह किए बिना कुछ समझदार होने की गारंटी केवल एक ही है, जब तक कि आपको विशेष रूप से किसी अन्य चर के शब्दार्थ की आवश्यकता न हो।

अंतर को नेगनेक्स प्रलेखन में समझाया गया है :

  • $host इसमें "पूर्ववर्ती के इस क्रम में: अनुरोध पंक्ति से होस्ट नाम या 'होस्ट' अनुरोध हेडर फ़ील्ड से होस्ट नाम या अनुरोध से मेल खाने वाला सर्वर नाम"
  • $http_host यदि यह अनुरोध में मौजूद था, तो HTTP "होस्ट" हेडर फ़ील्ड की सामग्री शामिल है
  • $server_nameइसमें server_nameवर्चुअल होस्ट शामिल है, जो अनुरोध को संसाधित करता है, क्योंकि यह nginx कॉन्फ़िगरेशन में परिभाषित किया गया था। यदि एक से serverअधिक server_names हैं, तो केवल पहला ही इस चर में मौजूद होगा।

चूँकि यह होस्ट-हेडर के बजाए अनुरोध-पंक्ति में होस्टनाम भेजने के लिए उपयोगकर्ता-एजेंटों के लिए कानूनी है, हालांकि यह शायद ही कभी किया जाता है जब परदे के पीछे जुड़ने के अलावा, आपको इसके लिए जिम्मेदार होना चाहिए।

आपको उस मामले के लिए भी ध्यान देना होगा जहां उपयोगकर्ता-एजेंट बिल्कुल होस्टनाम नहीं भेजते हैं, उदाहरण के लिए प्राचीन एचटीटीपी / 1.0 अनुरोध और आधुनिक बुरी तरह से लिखे गए सॉफ़्टवेयर। आप ऐसा कर सकते हैं कि उन्हें पकड़ कर सभी वर्चुअल होस्ट को डायवर्ट करें, जो कुछ भी नहीं देता है, यदि आप कई वेब साइटों की सेवा कर रहे हैं, या यदि आपके पास केवल आपके सर्वर पर एक ही वेब साइट है, तो आप एक ही वर्चुअल होस्ट के माध्यम से सब कुछ संसाधित कर सकते हैं। । उत्तरार्द्ध मामले में आपको इसके लिए भी जिम्मेदार होना चाहिए।

केवल उन $hostसभी संभावित चीजों के लिए चर खाते हैं जो एक HTTP अनुरोध बनाते समय एक उपयोगकर्ता-एजेंट कर सकते हैं।


2
दूसरी ओर, $server_nameसुरक्षित है जब Host:यूए से क्षेत्र में मनमाना सामग्री हो सकती है।
कुलथु

1
क्या $ http_host का नाम बदलकर $ होस्टनाम कर दिया गया है? मुझे Nginx doc में ऐसा वैरिएबल नहीं मिल रहा है। $ hostname सबसे समान है जो मुझे लगता है।
Darkbaby123

3
@ darkbaby123 नहीं, इसका नाम कुछ भी नहीं रखा गया था। प्रलेखन देखें ।
माइकल हैम्पटन

1
अब मैं समझ गया कि http_ <name> चर का क्या मतलब है। धन्यवाद!
Darkbaby123

0

मैं स्वीकृत उत्तर में उल्लेखित एक और महत्वपूर्ण बिंदु जोड़ना चाहूंगा।

$hostकरते नहीं पोर्ट संख्या है, जबकि $http_hostडीओ पोर्ट संख्या में शामिल हैं।

संपादित करें : हमेशा नहीं।

मैंने एक हेडर "add_header Y-ब्लॉग-http_host" हमेशा "http_host" सेट किया है।

तब curl -I -L domain.com:80(या 443) और हेडर बिल्कुल पोर्ट नंबर नहीं दिखाता है। नग्नेक्स-अतिरिक्त 1.10.3 के साथ सत्यापित। क्या यह इसलिए है क्योंकि यह सामान्य http (s) पोर्ट या nginx कॉन्फ़िगरेशन है? यह टिप्पणी सिर्फ बातें कहने के लिए हमेशा आपके सोचने के तरीके का व्यवहार नहीं करती है।


0

मैं भी कुछ समय तक इससे जूझता रहा। यह स्पष्ट हो गया जब मैंने समझा कि $ http_XXXXX सभी घोषित हेडर वेरिएबल्स को संदर्भित करता है।

तो $ http_user_agent, $ http_referer "USER AGENT" हैं, "REFERER" को निचले मामले और अंडरस्लैश में संदर्भित किया गया है। इसने मुझे समझाया कि जहाँ $ NG_upgrad कई NGINX कॉन्फ़िगरेशन नमूनों में से आ रहा था।

इसे https://stackoverflow.com/questions/15414810/whats-the-difference-of-host-and-http-host-in-nginx से पढ़ें

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