PHP में HTTP_HOST vs SERVER_NAME: क्या है असली अंतर?

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

PHP जासूसी: HTTP_HOST और SERVER_NAME के पीछे क्या छिपा है?

\n\n

अगर आपने कभी PHP में सुपरग्लोबल ऐरे $_SERVER को देखा है, तो आपने वहाँ दो बहुत समान कीज़ ज़रूर देखी होंगी: HTTP_HOST और SERVER_NAME। पहली नज़र में लगता है कि ये दोनों एक ही चीज़ हैं — सर्वर का नाम। लेकिन अनुभवी डेवलपर्स जानते हैं: असली खतरा बारीकियों में छिपा है। इस टॉपिक ने Stack Overflow पर हज़ारों व्यूज़ बटोरे हैं, और यह कोई संयोग नहीं है। गलत चुनाव रीडायरेक्ट में बग, क्रॉस-डोमेन रिक्वेस्ट में खराबी और यहाँ तक कि सुरक्षा कमज़ोरियाँ भी पैदा कर सकता है।

\n

इस लेख में हम सिर्फ़ सूखी परिभाषाएँ नहीं देंगे। हम एक असली जाँच करेंगे: समझेंगे कि ये वैल्यू कहाँ से आती हैं, अलग-अलग सर्वर (Apache, Nginx) पर ये कैसे व्यवहार करती हैं, और सबसे ज़रूरी — कब किस विकल्प का उपयोग करना चाहिए। तैयार हो जाइए, यह दिलचस्प होने वाला है।

\n\n

HTTP_HOST क्या है?

\n

HTTP_HOST — यह Host हेडर की वैल्यू है, जो ब्राउज़र (या कोई अन्य HTTP क्लाइंट) सर्वर को रिक्वेस्ट के हिस्से के रूप में भेजता है। HTTP/1.1 में यह हेडर अनिवार्य है और इसमें डोमेन नाम और संभवतः पोर्ट नंबर होता है।

\n

ब्राउज़र से रिक्वेस्ट का उदाहरण:

\n
GET /page.php HTTP/1.1\nHost: pythonlib.ru:8080\nUser-Agent: Mozilla/5.0\n...
\n

PHP में यह वैल्यू $_SERVER['HTTP_HOST'] में आती है। ध्यान दें: यह एक अप्रमाणित वैल्यू है। क्लाइंट Host हेडर में कोई भी टेक्स्ट भेज सकता है, जैसे evil-site.com या 192.168.1.1। यहीं पर सबसे बड़ा ख़तरा छिपा है।

\n\n

SERVER_NAME क्या है?

\n

SERVER_NAME — यह वह वैल्यू है जो वेब सर्वर अपनी कॉन्फ़िगरेशन के आधार पर सेट करता है। आमतौर पर यह Apache में ServerName डायरेक्टिव या Nginx में server_name से ली जाती है। यह उस वर्चुअल होस्ट का नाम है जिसने रिक्वेस्ट को प्रोसेस किया।

\n

Apache कॉन्फ़िगरेशन का उदाहरण:

\n
<VirtualHost *:80>\n    ServerName pythonlib.ru\n    DocumentRoot /var/www/pythonlib\n</VirtualHost>
\n

इस मामले में, $_SERVER['SERVER_NAME'] का मान pythonlib.ru होगा। HTTP_HOST के विपरीत, यह वैल्यू सर्वर एडमिनिस्ट्रेटर द्वारा नियंत्रित होती है, क्लाइंट द्वारा नहीं। हालाँकि, एक बारीकी है: SERVER_NAME में पोर्ट शामिल नहीं हो सकता (यह UseCanonicalName सेटिंग पर निर्भर करता है)।

\n\n

मुख्य अंतर एक तालिका में

\n

स्पष्टता के लिए सब कुछ एक तालिका में देखते हैं:

\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
पैरामीटरHTTP_HOSTSERVER_NAME
स्रोतक्लाइंट से HTTP रिक्वेस्ट हेडरवेब सर्वर की कॉन्फ़िगरेशन
नियंत्रणक्लाइंट (नकली हो सकता है)सर्वर एडमिनिस्ट्रेटर
पोर्टपोर्ट शामिल करता है अगर वह गैर-मानक है (जैसे, site.com:8080)आमतौर पर पोर्ट के बिना (UseCanonicalName पर निर्भर)
विश्वसनीयताकम (बिना जाँच के भरोसा न करें)उच्च (लेकिन पूर्ण नहीं)
उपयोगरीडायरेक्ट, उपयोगकर्ता के लिए लिंकआंतरिक लॉजिक, सुरक्षा
\n\n

कब क्या उपयोग करें? व्यावहारिक उदाहरण

\n

अब सबसे महत्वपूर्ण भाग पर आते हैं — कोड। आइए तीन सामान्य परिदृश्यों पर नज़र डालते हैं।

\n\n

1. उसी डोमेन पर रीडायरेक्ट (उदाहरण के लिए, www के साथ)

ब्लॉग

पुस्तक अनुशंसाएँ