PHP जासूसी: HTTP_HOST और SERVER_NAME के पीछे क्या छिपा है?
\n\nअगर आपने कभी PHP में सुपरग्लोबल ऐरे $_SERVER को देखा है, तो आपने वहाँ दो बहुत समान कीज़ ज़रूर देखी होंगी: HTTP_HOST और SERVER_NAME। पहली नज़र में लगता है कि ये दोनों एक ही चीज़ हैं — सर्वर का नाम। लेकिन अनुभवी डेवलपर्स जानते हैं: असली खतरा बारीकियों में छिपा है। इस टॉपिक ने Stack Overflow पर हज़ारों व्यूज़ बटोरे हैं, और यह कोई संयोग नहीं है। गलत चुनाव रीडायरेक्ट में बग, क्रॉस-डोमेन रिक्वेस्ट में खराबी और यहाँ तक कि सुरक्षा कमज़ोरियाँ भी पैदा कर सकता है।
इस लेख में हम सिर्फ़ सूखी परिभाषाएँ नहीं देंगे। हम एक असली जाँच करेंगे: समझेंगे कि ये वैल्यू कहाँ से आती हैं, अलग-अलग सर्वर (Apache, Nginx) पर ये कैसे व्यवहार करती हैं, और सबसे ज़रूरी — कब किस विकल्प का उपयोग करना चाहिए। तैयार हो जाइए, यह दिलचस्प होने वाला है।
\n\nHTTP_HOST क्या है?
\nHTTP_HOST — यह Host हेडर की वैल्यू है, जो ब्राउज़र (या कोई अन्य HTTP क्लाइंट) सर्वर को रिक्वेस्ट के हिस्से के रूप में भेजता है। HTTP/1.1 में यह हेडर अनिवार्य है और इसमें डोमेन नाम और संभवतः पोर्ट नंबर होता है।
ब्राउज़र से रिक्वेस्ट का उदाहरण:
\nGET /page.php HTTP/1.1\nHost: pythonlib.ru:8080\nUser-Agent: Mozilla/5.0\n...\nPHP में यह वैल्यू $_SERVER['HTTP_HOST'] में आती है। ध्यान दें: यह एक अप्रमाणित वैल्यू है। क्लाइंट Host हेडर में कोई भी टेक्स्ट भेज सकता है, जैसे evil-site.com या 192.168.1.1। यहीं पर सबसे बड़ा ख़तरा छिपा है।
SERVER_NAME क्या है?
\nSERVER_NAME — यह वह वैल्यू है जो वेब सर्वर अपनी कॉन्फ़िगरेशन के आधार पर सेट करता है। आमतौर पर यह Apache में ServerName डायरेक्टिव या Nginx में server_name से ली जाती है। यह उस वर्चुअल होस्ट का नाम है जिसने रिक्वेस्ट को प्रोसेस किया।
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| पैरामीटर | \nHTTP_HOST | \nSERVER_NAME | \n
|---|---|---|
| स्रोत | \nक्लाइंट से HTTP रिक्वेस्ट हेडर | \nवेब सर्वर की कॉन्फ़िगरेशन | \n
| नियंत्रण | \nक्लाइंट (नकली हो सकता है) | \nसर्वर एडमिनिस्ट्रेटर | \n
| पोर्ट | \nपोर्ट शामिल करता है अगर वह गैर-मानक है (जैसे, site.com:8080) | \n आमतौर पर पोर्ट के बिना (UseCanonicalName पर निर्भर) | \n
| विश्वसनीयता | \nकम (बिना जाँच के भरोसा न करें) | \nउच्च (लेकिन पूर्ण नहीं) | \n
| उपयोग | \nरीडायरेक्ट, उपयोगकर्ता के लिए लिंक | \nआंतरिक लॉजिक, सुरक्षा | \n
कब क्या उपयोग करें? व्यावहारिक उदाहरण
\nअब सबसे महत्वपूर्ण भाग पर आते हैं — कोड। आइए तीन सामान्य परिदृश्यों पर नज़र डालते हैं।
\n\n