webentwicklung-frage-antwort-db.com.de

Wie kann ich die vollständige URL der aktuellen Seite auf einem Windows/IIS-Server abrufen?

Ich habe eine WordPress - Installation in einen neuen Ordner auf einem Windows/ IS -Server verschoben. Ich stelle 301 Umleitungen in PHP ein, aber es scheint nicht zu funktionieren. Meine Post-URLs haben folgendes Format:

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

Ich kann nicht herausfinden, wie ich den /post-title/-Teil der URL packen kann.

$_SERVER["REQUEST_URI"] - was jeder zu empfehlen scheint - gibt einen leeren String zurück. $_SERVER["PHP_SELF"] gibt nur index.php zurück. Warum ist das so und wie kann ich es beheben?

137
CtrlDot

Vielleicht, weil Sie unter IIS sind, 

$_SERVER['PATH_INFO']

dies ist, was Sie wollen, basierend auf den URLs, die Sie zum Erklären verwendet haben.

Für Apache würden Sie $_SERVER['REQUEST_URI'] verwenden.

135
Vinko Vrsalovic
$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;
63
Tyler Carter

Für Apache:

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


Sie können auch HTTP_Host anstelle von SERVER_NAME als Herman-Kommentar verwenden. Siehe diese verwandte Frage für eine vollständige Diskussion. Kurz gesagt, Sie sind wahrscheinlich in Ordnung mit beiden. Hier ist die 'Host'-Version:

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


Für die Paranoiden/Warum es wichtig ist

Normalerweise setze ich ServerName in der VirtualHost, weil ich möchte, dass dass die kanonische - Form der Website ist. Der $_SERVER['HTTP_Host'] wird basierend auf den Anforderungsheadern festgelegt. Wenn der Server auf einen oder alle Domänennamen unter dieser IP-Adresse antwortet, könnte ein Benutzer den Header spoofen oder, schlimmer noch, jemand könnte einen DNS-Eintrag auf Ihre IP-Adresse verweisen, und Ihr Server/Ihre Website würde eine Website dynamisch bereitstellen Links, die auf einer falschen URL aufgebaut sind. Wenn Sie die letztere Methode verwenden, sollten Sie auch Ihre vhost konfigurieren oder eine .htaccess-Regel einrichten, um die Domäne zu erzwingen, die Sie ausgeben möchten.

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

Hoffentlich hilft das. Der eigentliche Punkt dieser Antwort bestand nur darin, die erste Codezeile für die Personen bereitzustellen, die bei der Suche nach einem Weg, die vollständige URL mit Apache zu erhalten, hier gelandet sind :)

36
cwd

$_SERVER['REQUEST_URI'] funktioniert nicht mit IIS, aber ich habe Folgendes gefunden:  http://neosmart.net/blog/2006/100-Apache-compliant-request_uri-for-iis-and-windows/ was klingt vielversprechend.

11
Greg

Verwenden Sie diese Klasse, damit die URL funktioniert.

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;
9
Sureshkumar

Hinzufügen:

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

Dann rufen Sie einfach die my_url-Funktion auf.

7
Avery

Ich verwende die folgende Funktion, um die aktuelle, vollständige URL abzurufen. Dies sollte auf IIS und Apache funktionieren.

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;
}
5
Jrgns

REQUEST_URI wird von Apache festgelegt, sodass Sie es nicht mit IIS erhalten. Versuchen Sie einen var_dump oder print_r für $ _SERVER und sehen Sie, welche Werte dort vorhanden sind, die Sie verwenden können.

4
Peter Bailey

Der posttitel-Teil von URL ist nach Ihrer index.php-Datei. Dies ist eine übliche Methode, freundliche URLs bereitzustellen, ohne mod_rewrite zu verwenden. Der Posttitel ist daher Teil der Abfragezeichenfolge, daher sollten Sie ihn mit $ _SERVER ['QUERY_STRING'] abrufen können.

3
Adam Hopkinson

Verwenden Sie die folgende Zeile oben auf der PHP - Seite, auf der Sie $_SERVER['REQUEST_URI'] verwenden. Dies wird Ihr Problem beheben.

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

Oh, der Spaß eines Schnipsel!

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;
    }
}

Es hat schöne Renditen wie:

// 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/"
//      }
1
SpYk3HH

Ich habe den folgenden Code verwendet und bekomme das richtige Ergebnis ...

<?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();
?>
0

Auf meinem Apache-Server erhalten Sie die vollständige URL in dem von Ihnen gesuchten Format:

$_SERVER["SCRIPT_URI"]
0

Reverse Proxy-Unterstützung!

Etwas robuster. Hinweis Es funktioniert nur bei 5.3 oder höher.

/*
 * Compatibility with multiple Host headers.
 * Support of "Reverse Proxy" configurations.
 *
 * Michael Jett <[email protected]>
 */

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'])), '/'));
}
0
user1949536

Jeder hat http_build_url vergessen?

http_build_url($_SERVER['REQUEST_URI']);

Wenn keine Parameter an http_build_url übergeben werden, wird automatisch die aktuelle URL übernommen. Ich würde erwarten, dass auch REQUEST_URI enthalten ist, obwohl dies für die Aufnahme der GET-Parameter erforderlich erscheint.

Das obige Beispiel gibt die vollständige URL zurück.

0
Gajus