PHP में पूरा URL प्राप्त करें: तेज़ और त्रुटि-रहित तरीका

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

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

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

PHP में पूरा URL प्राप्त करें: पहिया का पुनः आविष्कार न करें और परफॉरमेंस न खोएं

\n\n

हर PHP डेवलपर को कभी न कभी इस समस्या का सामना करना पड़ता है: "मैं वर्तमान पेज का पूरा URL कैसे प्राप्त करूं?"। यह आसान लगता है - बस $_SERVER['REQUEST_URI'] लें, डोमेन जोड़ें - और हो गया। लेकिन शैतान, हमेशा की तरह, विवरण में है। Stack Overflow पर "PHP में पूरा URL प्राप्त करें" सवाल ने हज़ारों व्यूज़ और दर्जनों जवाब जुटाए हैं। और यह कोई संयोग नहीं है।

\n\n

इस लेख में हम जानेंगे कि PHP में पूरा URL कैसे प्राप्त करें सही, तेज़ और बग-मुक्त तरीके से। आप जानेंगे कि HTTP_HOST और SERVER_NAME में क्या अंतर है, प्रोटोकॉल (HTTPS या HTTP) को सही तरीके से कैसे पहचानें, और क्यों इंटरनेट से कोड को आँख बंद करके कॉपी नहीं करना चाहिए। चलिए शुरू करते हैं!

\n\n

सरल तरीका हमेशा सबसे अच्छा क्यों नहीं होता?

\n\n

सबसे स्पष्ट विकल्प इस प्रकार दिखता है:

\n\n
<?php\n$fullUrl = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];\n?>
\n\n

यह कोड काम करता है, लेकिन केवल तब जब:

\n
    \n
  • आपके पास निश्चित रूप से HTTP है (HTTPS नहीं)
  • \n
  • 80 या 443 के अलावा कोई अन्य पोर्ट नहीं है
  • \n
  • सर्वर Host हेडर को सही ढंग से भेजता है
  • \n
\n\n

वास्तविक दुनिया में ये शर्तें हमेशा पूरी नहीं होतीं। यदि साइट HTTPS पर चल रही है, तो आपको http:// के साथ URL मिलेगा, जो ब्राउज़र में मिश्रित सामग्री त्रुटि का कारण बनेगा। यदि पोर्ट गैर-मानक है (जैसे 8080), तो वह खो जाएगा। और यदि कोई हमलावर Host हेडर को बदल देता है, तो आपको किसी दूसरे डोमेन का URL मिल सकता है।

\n\n

पूर्ण URL के घटक: विस्तृत विश्लेषण

\n\n

सार्वभौमिक समाधान लिखने से पहले, आइए याद करें कि पूर्ण URL में क्या शामिल होता है:

\n\n
scheme://host:port/path?query#fragment
\n\n

PHP में, हमारे पास सुपरग्लोबल ऐरे $_SERVER से निम्नलिखित तत्व उपलब्ध हैं:

\n
    \n
  • scheme — प्रोटोकॉल (HTTP या HTTPS)। कोई सीधी कुंजी नहीं है, लेकिन इसे $_SERVER['HTTPS'] या $_SERVER['REQUEST_SCHEME'] (PHP 7.4 से उपलब्ध) के माध्यम से निर्धारित किया जा सकता है।
  • \n
  • host — डोमेन। दो उम्मीदवार हैं: HTTP_HOST (Host हेडर से) और SERVER_NAME (सर्वर कॉन्फ़िगरेशन से)।
  • \n
  • port — पोर्ट। $_SERVER['SERVER_PORT']। यदि पोर्ट मानक है (HTTP के लिए 80, HTTPS के लिए 443), तो इसे छोड़ा जा सकता है।
  • \n
  • path — पथ। $_SERVER['REQUEST_URI'] में पथ और क्वेरी स्ट्रिंग शामिल है।
  • \n
  • query — क्वेरी स्ट्रिंग। इसे $_SERVER['QUERY_STRING'] के माध्यम से अलग से प्राप्त किया जा सकता है।
  • \n
  • fragment — एंकर। यह सर्वर पर नहीं भेजा जाता है, इसलिए इसे प्राप्त नहीं किया जा सकता।
  • \n
\n\n

सही समाधान: getFullUrl() फंक्शन

\n\n

यहाँ PHP में पूरा URL प्राप्त करने का एक विश्वसनीय और कुशल तरीका है:

\n\n
<?php\nfunction getFullUrl(): string {\n    // प्रोटोकॉल निर्धारित करें\n    $scheme = 'http';\n    if (\n        (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] === 'on' || $_SERVER['HTTPS'] === '1'))\n        || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')\n    ) {\n        $scheme = 'https';\n    }\n\n    // होस्ट: HTTP_HOST को प्राथमिकता दें, लेकिन खाली होने की जाँच करें\n    $host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? 'localhost';\n\n    // पोर्ट: केवल गैर-मानक होने पर जोड़ें\n    $port = (int) ($_SERVER['SERVER_PORT'] ?? 80);\n    $portStr = '';\n    if (\n        ($scheme === 'http' && $port !== 80) ||\n        ($scheme === 'https' && $port !== 443)\n    ) {\n        $portStr = ':' . $port;\n    }\n\n    // URI\n    $uri = $_SERVER['REQUEST_URI'] ?? '/';\n\n    return $scheme . '://' . $host . $portStr . $uri;\n}\n?>
\n\n

यह फंक्शन निम्नलिखित को ध्यान में रखता है:

\n
    \n
  • HTTPS प्रोटोकॉल (प्रॉक्सी सर्वर के माध्यम से X-Forwarded-Proto हेडर सहित)।
  • \n
  • गैर-मानक पोर्ट।
  • \

ब्लॉग

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