976 votes

Obtenir l'adresse URL complète en PHP

J'utilise ce code pour obtenir l'URL complète:

$actual_link = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];

Le problème est que j'utilise des masques dans mon .htaccess, de sorte que ce que nous voyons dans l'URL n'est pas toujours le vrai chemin d'accès du fichier.

Ce que j'ai besoin est d'obtenir la URL, ce qui est écrit dans l'URL, rien de plus et rien de moins-l'URL complète.

J'ai besoin d'obtenir la façon dont il apparaît dans la Barre de Navigation dans le navigateur web, et non pas le vrai chemin d'accès au fichier sur le serveur.

2253voto

ax. Points 22269

Jetez un oeil à l' $_SERVER['REQUEST_URI'], c'est à dire

$actual_link = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

(À noter que la double chaîne de caractères entre guillemets syntaxe est parfaitement correct)

Note de l'éditeur: à l'aide de ce code a des répercussions sur la sécurité. Le client peut définir HTTP_HOST à tout arbitraire de la valeur qu'il veut.

448voto

Timo Huovinen Points 8283

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?

191voto

Chen Asraf Points 5529

Pour cette question, il suffit de jeter un coup d'oeil à l'ensemble de la matrice avec l' print_r($_SERVER), vous verrez tout ce dont vous avez besoin là-bas :)

65voto

honyovk Points 1398

Une façon est:

$url = "http" . (($_SERVER['SERVER_PORT']==443) ? "s://" : "://") . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

C'est la plus petite et la plus simple façon de le faire, si un serveur web est l'utilisation de la norme le port 443 pour HTTPS.

46voto

Mon préféré de la croix-plate-forme de méthode pour trouver l'URL est:

$url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X