मैं विंडोज / IIS सर्वर पर वर्तमान पृष्ठ का पूर्ण URL कैसे प्राप्त कर सकता हूं?


137

मैंने विंडोज / IIS सर्वर पर एक नए फ़ोल्डर में एक वर्डप्रेस इंस्टॉलेशन स्थानांतरित किया । मैं PHP में 301 रीडायरेक्ट सेट कर रहा हूं, लेकिन यह काम नहीं कर रहा है। मेरे पोस्ट URL में निम्न प्रारूप हैं:

http:://www.example.com/OLD_FOLDER/index.php/post-title/

मैं यह पता नहीं लगा सकता कि /post-title/URL का हिस्सा कैसे पकड़ा जाए।

$_SERVER["REQUEST_URI"]- जिसे हर कोई सिफारिश करता है - एक खाली स्ट्रिंग लौटा रहा है। $_SERVER["PHP_SELF"]अभी लौट रहा है index.php। ऐसा क्यों है और मैं इसे कैसे ठीक कर सकता हुं?


24
बस एक print_r ($ _ SERVER) करें और देखें कि आपके पास कौन सा डेटा उपलब्ध है। यदि आप पूर्ण URL प्राप्त कर सकते हैं तो फ़ाइल नाम प्राप्त करने के लिए pathinfo ($ url) को कॉल कर सकते हैं।
२०

18
यह ध्यान दिया जाना चाहिए, कि यह प्रश्न IIS के बारे में है, सामान्य रूप से PHP नहीं। अपाचे के तहत आप बस $ _SERVER ['REQUEST_URI'] का उपयोग करेंगे।
21:01 पर माइकल टाटेरिएनिक्ज़

@Pies निश्चित रूप से $ _SERVER ['REQUEST_URI'] जाने का रास्ता है ... लेकिन मैं URI का एक विशिष्ट भाग कैसे ले सकता हूं। उदाहरण के लिए मेरे पास यह URI है: /Appointments/Administrator-events.php/219 ... मैं /events.php/ के बाद नंबर कैसे प्राप्त कर सकता हूं
दिमित्रीस

जवाबों:


135

हो सकता है, क्योंकि आप IIS के तहत हैं,

$_SERVER['PATH_INFO']

वह है जो आप चाहते हैं, उस URL के आधार पर जिसे आप समझाते थे।

अपाचे के लिए, आप उपयोग करेंगे $_SERVER['REQUEST_URI']


नमस्ते यह प्रयोग करके मैं सिर्फ निम्नलिखित त्रुटि प्राप्त करता हूं? Notice: Undefined index: PATH_INFO in /home/tdpk/public_html/system/config.php on line 14
छमेड

6
उफ़, ड्रैट - बस एहसास हुआ कि यह सवाल IIS के बारे में है, और मैं उपयोग कर रहा हूं। अधोगति के लिए क्षमा करें।
जेसन एस

63
$pageURL = (@$_SERVER["HTTPS"] == "on") ? "https://" : "http://";
if ($_SERVER["SERVER_PORT"] != "80")
{
    $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} 
else 
{
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}
return $pageURL;

11
ओपी ने स्पष्ट रूप से IIS - REQUEST_URI IIS के तहत उपलब्ध नहीं है
टॉम ऑगर

1
जब तक आप पूरी तरह से php में नहीं होते तब तक आपको कभी भी जादू-टोने का इस्तेमाल नहीं करना चाहिए।
केस

2
@TomAuger आपको टाइमलाइन देखने की जरूरत है। प्रश्न का उत्तर देने के बाद ओपी ने इसे जोड़ा। इसका उत्तर देने से लगभग एक साल पहले मूल प्रश्न पूछा गया था।
टायलर कार्टर

7
@Stan, युगल से अधिक एकल का उपयोग करने के लिए शून्य शुद्ध प्रदर्शन लाभ है। कोई नहीं, नड्डा, जिप, शून्य। यह PHP3 के युग से एक पुरानी पत्नी की कहानी है। कृपया सामग्री के लिए इस तरह के तुच्छ कार्य नहीं करें।
चार्ल्स

36

अपाचे के लिए:

'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']


आप हर्मन टिप्पणी के HTTP_HOSTबजाय भी उपयोग कर सकते हैं SERVER_NAME। पूरी चर्चा के लिए इससे संबंधित प्रश्न देखें । संक्षेप में, आप शायद या तो उपयोग करने के साथ ठीक हैं। यहाँ 'होस्ट' संस्करण है:

'http'.(empty($_SERVER['HTTPS'])?'':'s').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']


पैरानॉयड के लिए / यह क्यों मायने रखता है

आमतौर पर, मैं सेट ServerNameमें VirtualHostक्योंकि मैं चाहता हूँ कि होने के लिए विहित वेबसाइट के प्रपत्र। $_SERVER['HTTP_HOST']अनुरोध हेडर के आधार पर स्थापित किया जाएगा। यदि सर्वर उस आईपी पते पर किसी भी / सभी डोमेन नामों का जवाब देता है, तो उपयोगकर्ता हेडर को खराब कर सकता है, या इससे भी बदतर, कोई आपके आईपी पते पर DNS रिकॉर्ड को इंगित कर सकता है, और फिर आपका सर्वर / वेबसाइट डायनामिक के साथ एक वेबसाइट की सेवा करेगा। लिंक एक गलत URL पर बनाया गया है। यदि आप बाद वाली पद्धति का उपयोग करते हैं तो आपको अपने डोमेन को लागू करने के लिए vhostएक .htaccessनियम को भी कॉन्फ़िगर करना चाहिए या उस नियम को स्थापित करना चाहिए जिसे आप कुछ करना चाहते हैं:

RewriteEngine On
RewriteCond %{HTTP_HOST} !(^stackoverflow.com*)$
RewriteRule (.*) https://stackoverflow.com/$1 [R=301,L]
#sometimes u may need to omit this slash ^ depending on your server

उम्मीद है की वो मदद करदे। इस उत्तर का असली बिंदु केवल उन लोगों के लिए कोड की पहली पंक्ति प्रदान करना था, जो अपाचे के साथ पूरा URL प्राप्त करने का तरीका खोजते समय यहां समाप्त हो गए :)


2
इसके $_SERVER['HTTP_HOST']बजाय का उपयोग करना चाहिए $_SERVER['SERVER_NAME']। यदि कोई वर्चुअल होस्ट सेटअप है, तो SERVER_NAME उस नाम को दिखाएगा। यह कुछ ऐसा हो सकता है *.example.comजो मान्य नहीं है।
हरमन जे। रैडके III


9

URL काम करने के लिए इस वर्ग का उपयोग करें।

class VirtualDirectory
{
    var $protocol;
    var $site;
    var $thisfile;
    var $real_directories;
    var $num_of_real_directories;
    var $virtual_directories = array();
    var $num_of_virtual_directories = array();
    var $baseURL;
    var $thisURL;

    function VirtualDirectory()
    {
        $this->protocol = $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
        $this->site = $this->protocol . '://' . $_SERVER['HTTP_HOST'];
        $this->thisfile = basename($_SERVER['SCRIPT_FILENAME']);
        $this->real_directories = $this->cleanUp(explode("/", str_replace($this->thisfile, "", $_SERVER['PHP_SELF'])));
        $this->num_of_real_directories = count($this->real_directories);
        $this->virtual_directories = array_diff($this->cleanUp(explode("/", str_replace($this->thisfile, "", $_SERVER['REQUEST_URI']))),$this->real_directories);
        $this->num_of_virtual_directories = count($this->virtual_directories);
        $this->baseURL = $this->site . "/" . implode("/", $this->real_directories) . "/";
        $this->thisURL = $this->baseURL . implode("/", $this->virtual_directories) . "/";
    }

    function cleanUp($array)
    {
        $cleaned_array = array();
        foreach($array as $key => $value)
        {
            $qpos = strpos($value, "?");
            if($qpos !== false)
            {
                break;
            }
            if($key != "" && $value != "")
            {
                $cleaned_array[] = $value;
            }
        }
        return $cleaned_array;
    }
}

$virdir = new VirtualDirectory();
echo $virdir->thisURL;

10
यह ओवरकिल का एक सा नहीं है?
s3v3n

7

जोड़ें:

function my_url(){
    $url = (!empty($_SERVER['HTTPS'])) ?
               "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] :
               "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    echo $url;
}

फिर बस my_urlफ़ंक्शन को कॉल करें ।


5

मैं वर्तमान, पूर्ण URL प्राप्त करने के लिए निम्नलिखित फ़ंक्शन का उपयोग करता हूं। यह IIS और Apache पर काम करना चाहिए।

function get_current_url() {

  $protocol = 'http';
  if ($_SERVER['SERVER_PORT'] == 443 || (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on')) {
    $protocol .= 's';
    $protocol_port = $_SERVER['SERVER_PORT'];
  } else {
    $protocol_port = 80;
  }

  $host = $_SERVER['HTTP_HOST'];
  $port = $_SERVER['SERVER_PORT'];
  $request = $_SERVER['PHP_SELF'];
  $query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';

  $toret = $protocol . '://' . $host . ($port == $protocol_port ? '' : ':' . $port) . $request . (empty($query) ? '' : '?' . $query);

  return $toret;
}

अगर आप CGI आधारित Apache या IIS का उपयोग नहीं कर रहे हैं, तो argv काम नहीं करेगा, मुझे लगता है। मैंने Apache2 पर आपके कोड को नियमित मोड (नहीं CGI मोड) में आज़माया था और इसे गलत समझ रहा था क्योंकि $ _SERVER ['arv'] [0] कोई इंडेक्स नहीं है। ध्यान दें कि मेरे पास पूर्ण PHP त्रुटि रिपोर्टिंग चालू है और ये त्रुटियां नोटिस त्रुटियों थीं।
वोलोमाइक

एक आकर्षण की तरह काम करता है, बस क्वेरी स्ट्रिंग पैरामीटर पर त्रुटियों को रोकने के लिए थोड़ा अपडेट की आवश्यकता होती है $query = isset($_SERVER['argv']) ? substr($_SERVER['argv'][0], strpos($_SERVER['argv'][0], ';') + 1) : '';:। मैंने इसे शामिल करने के लिए आपके उत्तर को अपडेट कर दिया है।
जूल

4

REQUEST_URI Apache द्वारा सेट किया गया है, इसलिए आप इसे IIS से प्राप्त नहीं करेंगे। $ _SERVER पर एक var_dump या print_r करने का प्रयास करें और देखें कि वहां कौन से मूल्य मौजूद हैं जिनका आप उपयोग कर सकते हैं।


3

URL का पोस्ट-पार्ट आपकी index.phpफ़ाइल के बाद है , जो mod_rewrite का उपयोग किए बिना दोस्ताना URL प्रदान करने का एक सामान्य तरीका है। पोस्टटील वास्तव में क्वेरी स्ट्रिंग का हिस्सा है, इसलिए आपको $ _SERVER ['QUERY_STRING'] का उपयोग करके इसे प्राप्त करने में सक्षम होना चाहिए


2

PHP पृष्ठ के शीर्ष पर निम्न पंक्ति का उपयोग करें जहाँ आप उपयोग कर रहे हैं $_SERVER['REQUEST_URI']। इससे आपकी समस्या दूर हो जाएगी।

$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];

1

ओह, एक स्निपेट का मज़ा!

if (!function_exists('base_url')) {
    function base_url($atRoot=FALSE, $atCore=FALSE, $parse=FALSE){
        if (isset($_SERVER['HTTP_HOST'])) {
            $http = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http';
            $hostname = $_SERVER['HTTP_HOST'];
            $dir =  str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);

            $core = preg_split('@/@', str_replace($_SERVER['DOCUMENT_ROOT'], '', realpath(dirname(__FILE__))), NULL, PREG_SPLIT_NO_EMPTY);
            $core = $core[0];

            $tmplt = $atRoot ? ($atCore ? "%s://%s/%s/" : "%s://%s/") : ($atCore ? "%s://%s/%s/" : "%s://%s%s");
            $end = $atRoot ? ($atCore ? $core : $hostname) : ($atCore ? $core : $dir);
            $base_url = sprintf( $tmplt, $http, $hostname, $end );
        }
        else $base_url = 'http://localhost/';

        if ($parse) {
            $base_url = parse_url($base_url);
            if (isset($base_url['path'])) if ($base_url['path'] == '/') $base_url['path'] = '';
        }

        return $base_url;
    }
}

यह सुंदर रिटर्न की तरह है:

// A URL like http://stackoverflow.com/questions/189113/how-do-i-get-current-page-full-url-in-php-on-a-windows-iis-server:

echo base_url();    // Will produce something like: http://stackoverflow.com/questions/189113/
echo base_url(TRUE);    // Will produce something like: http://stackoverflow.com/
echo base_url(TRUE, TRUE); || echo base_url(NULL, TRUE); //Will produce something like: http://stackoverflow.com/questions/

// And finally:
echo base_url(NULL, NULL, TRUE);
// Will produce something like:
//      array(3) {
//          ["scheme"]=>
//          string(4) "http"
//          ["host"]=>
//          string(12) "stackoverflow.com"
//          ["path"]=>
//          string(35) "/questions/189113/"
//      }

0

हर कोई http_build_url भूल गया ?

http_build_url($_SERVER['REQUEST_URI']);

जब कोई पैरामीटर पास नहीं किया जाता http_build_urlहै, तो स्वचालित रूप से वर्तमान URL मान जाएगा। मैं REQUEST_URIजीईटी मापदंडों को शामिल करने के लिए आवश्यक होने के बावजूद भी इसमें शामिल होने की अपेक्षा करूंगा ।

उपरोक्त उदाहरण पूर्ण URL लौटाएगा।


1
इसके लिए pecl_http की आवश्यकता है।
उमर आबिद

@ उमरिद मैं इसकी सलाह देता हूं। :-)
गजस

मैं आपकी स्थिति समझता हूं। लेकिन जब स्क्रिप्ट का निर्माण विभिन्न प्लेटफार्मों में किया जा रहा है, जिस पर आपका नियंत्रण नहीं है, तो आपको कुछ मानक चुनने की आवश्यकता है।
उमर आबिद

1
यदि आप एक पुस्तकालय का निर्माण कर रहे हैं, तो आवश्यकताओं को परिभाषित करना आपके ऊपर है। मूल प्रश्न ऐसे परिदृश्य को बिल्कुल भी संबोधित नहीं करता है। इसलिए, यह सभी विकल्पों को नाम देने के लिए समझ में आता है।
गजस

0

मैंने निम्नलिखित कोड का उपयोग किया है, और मुझे सही परिणाम मिल रहा है ...

<?php
    function currentPageURL() {
        $curpageURL = 'http';
        if ($_SERVER["HTTPS"] == "on") {
            $curpageURL.= "s";
        }
        $curpageURL.= "://";
        if ($_SERVER["SERVER_PORT"] != "80") {
            $curpageURL.= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
        } 
        else {
            $curpageURL.= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
        }
        return $curpageURL;
    }
    echo currentPageURL();
?>

यह अच्छा काम कर रहा है यदि आप कोई HTTPS नहीं है तो आप इसे लाइन से हटाना चाहते हैं।

0

मेरे अपाचे सर्वर में, यह मुझे आपके द्वारा खोजे जा रहे सटीक प्रारूप में पूर्ण URL देता है:

$_SERVER["SCRIPT_URI"]

0

रिवर्स प्रॉक्सी समर्थन!

कुछ ज्यादा ही मजबूत। नोट यह केवल 5.3या अधिक पर काम करेगा ।

/*
 * Compatibility with multiple host headers.
 * Support of "Reverse Proxy" configurations.
 *
 * Michael Jett <mjett@mitre.org>
 */

function base_url() {

    $protocol = @$_SERVER['HTTP_X_FORWARDED_PROTO'] 
              ?: @$_SERVER['REQUEST_SCHEME']
              ?: ((isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") ? "https" : "http");

    $port = @intval($_SERVER['HTTP_X_FORWARDED_PORT'])
          ?: @intval($_SERVER["SERVER_PORT"])
          ?: (($protocol === 'https') ? 443 : 80);

    $host = @explode(":", $_SERVER['HTTP_HOST'])[0]
          ?: @$_SERVER['SERVER_NAME']
          ?: @$_SERVER['SERVER_ADDR'];

    // Don't include port if it's 80 or 443 and the protocol matches
    $port = ($protocol === 'https' && $port === 443) || ($protocol === 'http' && $port === 80) ? '' : ':' . $port;

    return sprintf('%s://%s%s/%s', $protocol, $host, $port, @trim(reset(explode("?", $_SERVER['REQUEST_URI'])), '/'));
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.