PHP में पूर्ण URL: जल्दी और त्रुटि रहित कैसे प्राप्त करें

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

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

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

PHP में पूर्ण URL कैसे प्राप्त करें और पागल न हों?

\n\n

PHP पर हर डेवलपर कम से कम एक बार इस कार्य का सामना करता है: "मैं वर्तमान पृष्ठ का पूर्ण URL कैसे प्राप्त करूं?" ऐसा लगता है कि इससे आसान कुछ नहीं हो सकता - $_SERVER['HTTP_HOST'] लें, $_SERVER['REQUEST_URI'] जोड़ें - और हो गया। लेकिन वास्तविकता, हमेशा की तरह, अपने सुधार लाती है। HTTP या HTTPS? क्या होगा यदि पोर्ट गैर-मानक है? क्या होगा यदि साइट प्रॉक्सी के पीछे है? क्या होगा यदि आपको केवल प्राप्त करने की नहीं, बल्कि इसे जल्दी, मेमोरी लीक के बिना और भविष्य के लिए रिजर्व के साथ करने की आवश्यकता है?

\n\n

Stack Overflow पर "PHP में पूर्ण URL प्राप्त करें" प्रश्न ने हजारों व्यू और दर्जनों उत्तर प्राप्त किए हैं। यह आकस्मिक नहीं है: विषय सरल लगता है, लेकिन इसमें वसंत के गड्ढे जितने ही छिपे हुए खतरे हैं। आज हम केवल "कैसे करें" नहीं, बल्कि सही, तेज़ और विश्वसनीय तरीके से कैसे करें, यह समझेंगे। चलिए शुरू करते हैं!

\n\n

$_SERVER से सीधे कॉपी करना बुरा क्यों है?

\n\n

शुरुआती डेवलपर अक्सर ऐसा लिखते हैं:

\n\n
$url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
\n\n

पहली नज़र में - यह काम करता है। लेकिन आइए समस्याओं पर नज़र डालें:

\n
    \n
  • कोई HTTPS नहीं। यदि साइट HTTPS पर काम करती है, तो आपको http:// मिलेगा - और ब्राउज़र मिश्रित सामग्री पर आपत्ति करेगा।
  • \n
  • पोर्ट। यदि पोर्ट गैर-मानक है (उदाहरण के लिए, 8080), तो यदि आप $_SERVER['SERVER_PORT'] का उपयोग नहीं करते हैं तो यह खो जाएगा।
  • \n
  • प्रॉक्सी और लोड बैलेंसर। रिवर्स प्रॉक्सी (Nginx, Cloudflare) के पीछे, $_SERVER['HTTP_HOST'] वह नहीं हो सकता जो उपयोगकर्ता देखता है।
  • \n
  • सुरक्षा। HTTP_HOST का मान हमलावर द्वारा बदला जा सकता है (Host header injection)।
  • \n
\n\n

संक्षेप में, Stack Overflow पर पहले उत्तर से कॉपीपेस्ट करना सबसे अच्छा विकल्प नहीं है। आइए एक सही और कुशल फ़ंक्शन लिखें।

\n\n

आदर्श फ़ंक्शन: पूर्ण URL सही ढंग से प्राप्त करें

\n\n

यहाँ एक विश्वसनीय फ़ंक्शन है जो सभी मुख्य परिदृश्यों को ध्यान में रखता है:

\n\n
function getFullUrl(): string {\n    $protocol = 'http';\n    if (\n        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')\n        || (int)$_SERVER['SERVER_PORT'] === 443\n    ) {\n        $protocol = 'https';\n    }\n\n    // प्रॉक्सी से हेडर को ध्यान में रखें (यदि भरोसा है)\n    $host = $_SERVER['HTTP_HOST'] ?? '';\n    if (empty($host) && !empty($_SERVER['SERVER_NAME'])) {\n        $host = $_SERVER['SERVER_NAME'];\n    }\n\n    // पोर्ट की जाँच\n    $port = (int)$_SERVER['SERVER_PORT'];\n    $portSuffix = '';\n    if (\n        ($protocol === 'http' && $port !== 80)\n        || ($protocol === 'https' && $port !== 443)\n    ) {\n        $portSuffix = ':' . $port;\n    }\n\n    $uri = $_SERVER['REQUEST_URI'] ?? '/';\n\n    return $protocol . '://' . $host . $portSuffix . $uri;\n}
\n\n

यहाँ क्या महत्वपूर्ण है?

\n
    \n
  • HTTPS की जाँच करें - मानक तरीका, 99% मामलों में काम करता है।
  • \n
  • SERVER_PORT को ध्यान में रखें - यदि साइट गैर-मानक पोर्ट पर है, तो इसे न खोएं।
  • \n
  • SERVER_NAME के माध्यम से बैकअप विकल्प - यदि HTTP_HOST खाली है तो।
  • \n
  • $_SERVER['SCRIPT_URI'] का उपयोग न करें - यह हर जगह उपलब्ध नहीं है।
  • \n
\n\n

प्रदर्शन अनुकूलन: जब हर मिलीसेकंड मायने रखता है

\n\n

यदि आप इस फ़ंक्शन को हर पृष्ठ पर या लूप में कॉल करते हैं, तो गति के बारे में सोचना उचित है। यहाँ कुछ तरीके दिए गए हैं:

\n\n

1. परिणाम को कैश करना

\n

यदि URL एक अनुरोध के भीतर नहीं बदलता है (और यह नहीं बदलता है), तो इसे कैश करें:

\n\n
function getFullUrlCached(): string {\n    static $url = null;\n    if ($url === null) {\n        $url = getFullUrl(); // ऊपर दिए गए हमारे फ़ंक्शन का उपयोग करें\n    }\n    return $url;\n}
\n\n

स्टैटिक वेरिएबल पहली कॉल के बाद मान को सहेजता है - कोई बार-बार गणना नहीं।

\n\n

2. अनावश्यक संचालन से बचें

\n

filt का उपयोग न करें

ब्लॉग

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