PHP में पूरा URL प्राप्त करें: पहिया का पुनः आविष्कार न करें और परफॉरमेंस न खोएं
\n\nहर PHP डेवलपर को कभी न कभी इस समस्या का सामना करना पड़ता है: "मैं वर्तमान पेज का पूरा URL कैसे प्राप्त करूं?"। यह आसान लगता है - बस $_SERVER['REQUEST_URI'] लें, डोमेन जोड़ें - और हो गया। लेकिन शैतान, हमेशा की तरह, विवरण में है। Stack Overflow पर "PHP में पूरा URL प्राप्त करें" सवाल ने हज़ारों व्यूज़ और दर्जनों जवाब जुटाए हैं। और यह कोई संयोग नहीं है।
इस लेख में हम जानेंगे कि PHP में पूरा URL कैसे प्राप्त करें सही, तेज़ और बग-मुक्त तरीके से। आप जानेंगे कि HTTP_HOST और SERVER_NAME में क्या अंतर है, प्रोटोकॉल (HTTPS या HTTP) को सही तरीके से कैसे पहचानें, और क्यों इंटरनेट से कोड को आँख बंद करके कॉपी नहीं करना चाहिए। चलिए शुरू करते हैं!
सरल तरीका हमेशा सबसे अच्छा क्यों नहीं होता?
\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
वास्तविक दुनिया में ये शर्तें हमेशा पूरी नहीं होतीं। यदि साइट HTTPS पर चल रही है, तो आपको http:// के साथ URL मिलेगा, जो ब्राउज़र में मिश्रित सामग्री त्रुटि का कारण बनेगा। यदि पोर्ट गैर-मानक है (जैसे 8080), तो वह खो जाएगा। और यदि कोई हमलावर Host हेडर को बदल देता है, तो आपको किसी दूसरे डोमेन का URL मिल सकता है।
\n\nपूर्ण URL के घटक: विस्तृत विश्लेषण
\n\nसार्वभौमिक समाधान लिखने से पहले, आइए याद करें कि पूर्ण URL में क्या शामिल होता है:
\n\nscheme://host:port/path?query#fragment\n\nPHP में, हमारे पास सुपरग्लोबल ऐरे $_SERVER से निम्नलिखित तत्व उपलब्ध हैं:
- \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
सही समाधान: 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 - गैर-मानक पोर्ट। \