Comment puis-je obtenir L'URL complète de la page courante sur un serveur Windows/IIS?

j'ai déplacé un WordPress installation à un nouveau dossier sur un serveur Windows/ IIS . Je mets en place 301 redirections en PHP, mais ça ne semble pas fonctionner. Les URLs de mes messages ont le format suivant:

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

Je ne sais pas comment saisir la partie /post-title/ de L'URL.

$_SERVER["REQUEST_URI"] - ce que tout le monde semble recommander - renvoie une chaîne vide. $_SERVER["PHP_SELF"] est juste le retour "à la 151940920" . Pourquoi est-ce, et comment puis-je le réparer?

137
demandé sur Peter Mortensen 2008-10-10 00:39:49

15 réponses

peut-être, parce que vous êtes sous IIS,

$_SERVER['PATH_INFO']

est ce que vous voulez, basé sur les URLs que vous avez utilisé pour expliquer.

pour Apache, vous utiliserez $_SERVER['REQUEST_URI'] .

135
répondu Vinko Vrsalovic 2014-03-11 00:20:06
$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
répondu Tyler Carter 2012-12-16 20:44:16

Pour Apache:

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



Vous pouvez également utiliser HTTP_HOST au lieu de SERVER_NAME comme Herman l'a commenté. Voir cette question connexe pour une discussion complète. En bref, vous êtes probablement D'accord avec l'utilisation de l'un ou l'autre. Voici la version 'host':

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



Pour les Paranoïaques / Pourquoi c'est important

Typiquement, je mets ServerName dans le VirtualHost parce que je veux que soit le canonique forme du site web. Le $_SERVER['HTTP_HOST'] est défini en fonction des en-têtes de requête. Si le serveur répond à n'importe quel / tous les noms de domaine à cette adresse IP, un utilisateur pourrait mystifier l'en-tête, ou pire, quelqu'un pourrait pointer un enregistrement DNS à votre adresse IP, et puis votre serveur / site web servirait un site Web avec des liens dynamiques construits sur une URL incorrecte. Si vous utilisez cette dernière méthode, vous devriez également configurer votre vhost ou mettre en place une règle .htaccess pour appliquer le domaine que vous voulez servir, quelque chose comme:

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

Espère que ça aide. Le vrai point de cette réponse était juste de fournir la première ligne de code pour les personnes qui ont fini ici en cherchant un moyen d'obtenir l'URL complète avec apache:)

36
répondu cwd 2017-05-23 11:33:17

$_SERVER['REQUEST_URI'] ne fonctionne pas sur IIS, mais j'ai trouvé ceci: http://neosmart.net/blog/2006/100-apache-compliant-request_uri-for-iis-and-windows / ce qui semble prometteur.

11
répondu Greg 2008-10-09 20:42:05

utilisez cette classe pour obtenir l'URL fonctionne.

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
répondu Sureshkumar 2014-04-13 11:23:24

ajouter:

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

alors il suffit d'appeler la fonction my_url .

7
répondu Avery 2014-04-13 11:21:32

j'utilise la fonction suivante pour obtenir L'URL complète actuelle. Ça devrait marcher sur IIS et 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;
}
5
répondu Jrgns 2013-01-03 13:59:33

REQUEST_URI est défini par Apache, donc vous ne l'obtiendrez pas avec IIS. Essayez de faire un var_dump ou print_r sur $_SERVER et voyez quelles valeurs existent là-bas que vous pouvez utiliser.

4
répondu Peter Bailey 2008-10-09 20:48:15

la partie posttitle du URL est après votre index.php fichier, qui est une façon courante de fournir des URLs conviviales sans utiliser mod_rewrite. Le posttitle fait donc partie de la chaîne de requête, donc vous devriez pouvoir l'obtenir en utilisant $_SERVER ['QUERY_STRING']

3
répondu Adam Hopkinson 2014-04-13 11:13:07

utilisez la ligne suivante en haut de la page PHP où vous utilisez $_SERVER['REQUEST_URI'] . Cela permettra de résoudre votre problème.

$_SERVER['REQUEST_URI'] = $_SERVER['PHP_SELF'] . '?' . $_SERVER['argv'][0];
2
répondu beniwal 2014-04-13 11:25:29

Oh, le plaisir d'un extrait de!

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

il a de beaux retours comme:

// A URL like /q/how-can-i-get-the-current-page-s-full-url-on-a-windows-iis-server-65603/"scheme"]=>
//          string(4) "http"
//          ["host"]=>
//          string(12) "stackoverflow.com"
//          ["path"]=>
//          string(35) "/questions/189113/"
//      }
1
répondu SpYk3HH 2014-04-14 12:56:01

tout le monde a oublié http_build_url ?

http_build_url($_SERVER['REQUEST_URI']);

quand aucun paramètre n'est passé à http_build_url il assumera automatiquement L'URL courante. Je m'attends à ce REQUEST_URI ainsi, bien qu'il semble être nécessaire afin d'inclure les paramètres GET.

l'exemple ci-dessus renvoie L'URL complète.

0
répondu Gajus 2013-10-20 21:26:50

j'ai utilisé le code suivant, et j'obtiens le bon résultat...

<?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
répondu Joomla Developers 2014-04-13 11:20:00

dans mon serveur apache, cela me donne L'URL complète dans le format exact que vous recherchez:

$_SERVER["SCRIPT_URI"]
0
répondu Hüseyin Yağlı 2014-12-21 01:15:40

Reverse Proxy Support!

quelque Chose d'un peu plus robuste. Note ça ne marchera que sur 5.3 ou plus.

/*
 * 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'])), '/'));
}
0
répondu user1949536 2016-08-30 15:49:49