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?
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']
.
$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;
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:)
$_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.
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;
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
.
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;
}
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.
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']
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];
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/"
// }
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.
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();
?>
dans mon serveur apache, cela me donne L'URL complète dans le format exact que vous recherchez:
$_SERVER["SCRIPT_URI"]
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'])), '/'));
}