Question Obtenez l'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, donc ce que nous voyons dans l'URL n'est pas toujours le vrai chemin du fichier.

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

J'ai besoin d'obtenir comment il apparaît dans la barre de navigation dans le navigateur Web, et non le chemin réel du fichier sur le serveur.


979
2017-07-20 21:29


origine


Réponses:


Jettes un coup d'oeil à $_SERVER['REQUEST_URI'], c'est à dire.

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

(Notez que la syntaxe de chaîne entre guillemets doubles est parfaitement correct)

Si vous voulez supporter à la fois HTTP et HTTPS, vous pouvez utiliser

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

Note de l'éditeur: en utilisant ce code a implications pour la sécurité. Le client peut définir HTTP_HOST et REQUEST_URI à n'importe quelle valeur arbitraire qu'il veut.


1623
2017-07-20 21:33



Version courte pour afficher le lien sur une page Web

$url =  "//{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}";

$escaped_url = htmlspecialchars( $url, ENT_QUOTES, 'UTF-8' );
echo '<a href="' . $escaped_url . '">' . $escaped_url . '</a>';

Voici plus de détails sur les problèmes et les cas de bord de le format //example.com/path/

Version complète

function url_origin( $s, $use_forwarded_host = false )
{
    $ssl      = ( ! empty( $s['HTTPS'] ) && $s['HTTPS'] == 'on' );
    $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;

Ceci est une version fortement modifiée de http://snipplr.com/view.php?codeview&id=2734.

Structure de l'URL:

schème://Identifiant Mot de passe@domain: port / chemin d'accès? query_string #fragment_id

Les parties en gras ne seront pas incluses par la fonction

Remarques:

  • Cette fonction n'inclut pas username:password à partir d'une URL complète ou du fragment (hachage).
  • Il ne montrera pas le port 80 par défaut pour HTTP et le port 443 pour HTTPS.
  • Testé uniquement avec les schémas http et https.
  • le #fragment_id n'est pas envoyé au serveur par le client (navigateur) et ne sera pas ajouté à l'URL complète.
  • $_GET ne contiendra foo=bar2 pour une URL comme /example?foo=bar1&foo=bar2.
  • Certains CMS et environnements vont réécrire $_SERVER['REQUEST_URI'] et retour /example?foo=bar2 pour une URL comme /example?foo=bar1&foo=bar2, utilisation $_SERVER['QUERY_STRING'] dans ce cas.
  • Gardez à l'esprit qu'un URI = URL + URN, mais en raison de l'utilisation populaire, URL signifie maintenant à la fois URI et URL.
  • Vous devriez enlever HTTP_X_FORWARDED_HOST si vous ne prévoyez pas d'utiliser des procurations ou des équilibreurs.
  • le spec dit que le Host L'en-tête doit contenir le numéro de port sauf s'il s'agit du numéro par défaut.

Variables contrôlées par le client (navigateur):

  • $_SERVER['REQUEST_URI']. Tous les caractères non pris en charge sont codés par le navigateur avant d'être envoyés.
  • $_SERVER['HTTP_HOST'] et n'est pas toujours disponible selon les commentaires du manuel PHP: http://php.net/manual/fr/reserved.variables.php
  • $_SERVER['HTTP_X_FORWARDED_HOST'] est fixé par les équilibreurs et n'est pas mentionné dans la liste des $_SERVER variables dans le manuel PHP.

Variables contrôlées par le serveur:

  • $_SERVER['HTTPS']. Le client choisit de l'utiliser, mais le serveur renvoie la valeur réelle de vide ou "on".
  • $_SERVER['SERVER_PORT']. Le serveur n'accepte que les numéros autorisés en tant que ports.
  • $_SERVER['SERVER_PROTOCOL']. Le serveur accepte uniquement certains protocoles.
  • $_SERVER['SERVER_NAME'] . Il est défini manuellement dans la configuration du serveur et n'est pas disponible pour IPv6 selon kralyk.

En relation:

HTTP_HOST et SERVER_NAME
Le numéro de port est-il requis dans le paramètre d'en-tête HTTP "Host"?
https://stackoverflow.com/a/28049503/175071


357
2018-01-17 08:57



Pour cette question, jetez un oeil à tout le tableau avec print_r($_SERVER), vous verrez tout ce dont vous avez besoin ici :)


190
2017-07-20 21:35



Exemples d'URL: https://example.com/subFolder/yourfile.php?var=blabla#12345

//built-in function 
$x = parse_url($url);
$x['scheme']               🡺 https
$x['host']                 🡺         example.com (or with WWW)
$x['path']                 🡺                    /subFolder/yourfile.php
$x['query']                🡺                                          var=blabla
$x['fragment']             🡺                                                     12345 // hashtag outputed only in case, when hashtag-containing string was manually passed to function, otherwise PHP is unable to recognise hashtags in $_SERVER

//built-in function  (with this function, I only recommend to pass `parse_url`s output as argument)
$A = pathinfo($url);
$B = pathinfo(parse_url($url)['path']);
$A['dirname']              🡺 https://example.com/subFolder
$B['dirname']              🡺                    /subFolder
$A['basename']             🡺                               yourfile.php?var=blabla#12345
$B['basename']             🡺                               yourfile.php
$A['extension']            🡺                                        php?var=blabla#12345
$B['extension']            🡺                                        php
$A['filename']             🡺                               yourfile
$B['filename']             🡺                               yourfile


//=================================================== //
//========== self-defined SERVER variables ========== //
//=================================================== //
$_SERVER["DOCUMENT_ROOT"]  🡺 /home/user/public_html
$_SERVER["SERVER_ADDR"]    🡺 143.34.112.23
$_SERVER["SERVER_PORT"]    🡺 80(or 443 etc..)
$_SERVER["REQUEST_SCHEME"] 🡺 https                                         //similar: $_SERVER["SERVER_PROTOCOL"] 
$_SERVER['HTTP_HOST']      🡺         example.com (or with WWW)             //similar: $_SERVER["ERVER_NAME"]
$_SERVER["REQUEST_URI"]    🡺                       /subFolder/yourfile.php?var=blabla
$_SERVER["QUERY_STRING"]   🡺                                               var=blabla
__FILE__                   🡺 /home/user/public_html/subFolder/yourfile.php
__DIR__                    🡺 /home/user/public_html/subFolder              //same: dirname(__FILE__)
$_SERVER["REQUEST_URI"]    🡺                       /subFolder/yourfile.php?var=blabla
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)🡺  /subFolder/yourfile.php 
$_SERVER["PHP_SELF"]       🡺                       /subFolder/yourfile.php

// ==================================================================//
//if "YOURFILE.php" is included in "PARENTFILE.php" , and you visit  "PARENTFILE.PHP?abc":
$_SERVER["SCRIPT_FILENAME"]🡺 /home/user/public_html/parentfile.php
$_SERVER["PHP_SELF"]       🡺                       /parentfile.php
$_SERVER["REQUEST_URI"]    🡺                       /parentfile.php?abc
__FILE__                   🡺 /home/user/public_html/subFolder/yourfile.php

// =================================================== //
// ================= handy variables ================= //
// =================================================== //
//If site uses HTTPS:
$HTTP_or_HTTPS = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS']!=='off') || $_SERVER['SERVER_PORT']==443) ? 'https://':'http://' );            //in some cases, you need to add this condition too: if ('https'==$_SERVER['HTTP_X_FORWARDED_PROTO'])  ...

//To trim values to filename, i.e. 
basename($url)             🡺 yourfile.php

//excellent solution to find origin
$debug_files = debug_backtrace();       $initial_called_file = count($debug_files) ? $debug_files[count($debug_files) - 1]['file'] : __FILE__;

Remarquer!:

  • hastag (# ...) les pièces d'url ne peuvent pas être détectées depuis PHP (côté serveur). Pour cela, utilisez Javascript.
  • DIRECTORY_SEPARATOR résultats \ pour les hébergements de type Windows, au lieu de /.



Pour WordPress

//(let's say, if wordpress is installed in subdirectory:  http://example.com/wpdir/)
home_url()                      🡺 http://example.com/wpdir/        //if is_ssl() is true, then it will be "https"
get_stylesheet_directory_uri()  🡺 http://example.com/wpdir/wp-content/themes/THEME_NAME  [same: get_bloginfo('template_url') ]
get_stylesheet_directory()      🡺 /home/user/public_html/wpdir/wp-content/themes/THEME_NAME
plugin_dir_url(__FILE__)        🡺 http://example.com/wpdir/wp-content/themes/PLUGIN_NAME
plugin_dir_path(__FILE__)       🡺 /home/user/public_html/wpdir/wp-content/plugins/PLUGIN_NAME/  

171
2017-11-15 09:59



Voici une solution utilisant un déclaration ternaire, en gardant le code minimal:

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

C'est la manière la plus simple et la plus simple de le faire, en supposant que le serveur Web utilise le port standard 443 pour HTTPS.


54
2018-04-24 13:30



Ma méthode multiplateforme préférée pour trouver l'URL actuelle est:

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

39
2018-05-18 01:54



Utilisez simplement:

$uri = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']

22
2017-12-09 09:07



function full_path()
{
    $s = &$_SERVER;
    $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 = 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;
    $uri = $protocol . '://' . $host . $s['REQUEST_URI'];
    $segments = explode('?', $uri, 2);
    $url = $segments[0];
    return $url;
}

Note: Je viens de faire une mise à jour du code de "Timo Huovinen", donc vous n'obtiendrez aucun get dans l'URL. Cette URL est claire et supprime des choses comme "? Hi = i & am = a & get".

Exemple:

http://www.website.com/index?get=information

sera montré comme:

http://www.website.com/index

Sauf si vous utilisez Get pour définir un contenu spécifique, utilisez son code! :-)


16
2017-10-26 13:15