Version courte à la sortie de lien sur une page web
$link = "//$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$escaped_link = htmlspecialchars($link, ENT_QUOTES, 'UTF-8');
echo '<a href="'.$escaped_link.'">'.$escaped_link.'</a>';
Voici quelques détails supplémentaires sur les questions et les cas de bord de l' //example.com/path/ format
Version complète
function url_origin($s, $use_forwarded_host=false)
{
$ssl = (!empty($s['HTTPS']) && $s['HTTPS'] == 'on') ? true:false;
$sp = strtolower($s['SERVER_PROTOCOL']);
$protocol = substr($sp, 0, strpos($sp, '/')) . (($ssl) ? 's' : '');
$port = $s['SERVER_PORT'];
$port = ((!$ssl && $port=='80') || ($ssl && $port=='443')) ? '' : ':'.$port;
$host = ($use_forwarded_host && isset($s['HTTP_X_FORWARDED_HOST'])) ? $s['HTTP_X_FORWARDED_HOST'] : (isset($s['HTTP_HOST']) ? $s['HTTP_HOST'] : null);
$host = isset($host) ? $host : $s['SERVER_NAME'] . $port;
return $protocol . '://' . $host;
}
function full_url($s, $use_forwarded_host=false)
{
return url_origin($s, $use_forwarded_host) . $s['REQUEST_URI'];
}
$absolute_url = full_url($_SERVER);
echo $absolute_url;
C'est une version fortement modifiée de http://snipplr.com/view.php?codeview&id=2734
.
Structure de l'URL:
schéma://nom d'utilisateur:mot de passe@domaine:port/chemin?query_string#fragment_id
Les parties en gras ne seront pas inclus par la fonction
Notes:
- Cette fonction n'incluent
username:password
à partir d'une URL complète ou le fragment (hash).
- Il ne sera pas affiché par défaut le port 80 pour HTTP et le port 443 pour HTTPS.
- Testé uniquement avec les protocoles http et https régimes.
- L'
#fragment_id
n'est pas envoyé au serveur par le client (navigateur) et ne sera pas ajouté à l'URL complète.
-
$_GET
ne contiennent foo=bar2
pour une URL de la forme /example?foo=bar1&foo=bar2
.
- Certains CMS et les environnements de réécrire l'
$_SERVER['REQUEST_URI']
et retour /example?foo=bar2
pour une URL de la forme /example?foo=bar1&foo=bar2
, utilisez $_SERVER['QUERY_STRING']
dans ce cas.
- Gardez à l'esprit qu'une URI =
URL + URN
, mais en raison de l'usage populaire, URL maintenant signifie à la fois URI et URL.
- Vous devez supprimer
HTTP_X_FORWARDED_HOST
si vous ne prévoyez pas d'utiliser des proxys ou des équilibreurs de charge.
- La spec dit que l'
Host
d'en-tête doit contenir le numéro de port, sauf si c'est le nombre par défaut.
Le Client (Navigateur) variables contrôlées:
-
$_SERVER['REQUEST_URI']
. Tout pris en charge les caractères sont codés par le navigateur avant qu'ils ne soient envoyés.
-
$_SERVER['HTTP_HOST']
et n'est pas toujours disponible selon les commentaires dans le manuel PHP: http://php.net/manual/en/reserved.variables.php
-
$_SERVER['HTTP_X_FORWARDED_HOST']
est défini par des équilibreurs de charge et n'est pas mentionné dans la liste des $_SERVER
variables dans le manuel PHP.
Serveur de variables contrôlées:
-
$_SERVER['HTTPS']
. Le client choisit d'utiliser, mais le serveur renvoie la valeur réelle de vide ou "sur".
-
$_SERVER['SERVER_PORT']
. Le serveur accepte uniquement autorisé numéros de ports.
-
$_SERVER['SERVER_PROTOCOL']
. Le serveur accepte uniquement certains protocoles.
-
$_SERVER['SERVER_NAME']
. Il est réglée manuellement dans la configuration du serveur et n'est pas disponible pour IPv6 selon kralyk.
Connexes:
HTTP_HOST vs SERVER_NAME
Est le Numéro de Port Requis en HTTP "Hôte" Paramètre d'en-Tête?