Frage Holen Sie sich die vollständige URL in PHP


Ich verwende diesen Code, um die vollständige URL zu erhalten:

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

Das Problem ist, dass ich einige Masken in meinem benutze .htaccess, was wir in der URL sehen, ist nicht immer der tatsächliche Pfad der Datei.

Was ich brauche ist, um die URL zu erhalten, was in der URL geschrieben ist, nicht mehr und nicht weniger - die vollständige URL.

Ich muss herausfinden, wie es in der Navigationsleiste im Webbrowser angezeigt wird, und nicht den tatsächlichen Pfad der Datei auf dem Server.


979
2017-07-20 21:29


Ursprung


Antworten:


Schau es dir an $_SERVER['REQUEST_URI'], d.h.

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

(Beachten Sie, dass die Syntax der doppelten Zeichenfolge in Anführungszeichen ist vollkommen korrekt)

Wenn Sie sowohl HTTP als auch HTTPS unterstützen möchten, können Sie verwenden

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

Anmerkung der Redaktion: mit diesem Code hat Auswirkungen auf die Sicherheit. Der Client kann HTTP_HOST und REQUEST_URI auf einen beliebigen beliebigen Wert setzen.


1623
2017-07-20 21:33



Kurze Version zum Ausgeben eines Links auf einer Webseite

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

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

Hier sind einige weitere Details zu den Problemen und Randfällen von Das Format //example.com/path/

Vollversion

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;

Dies ist eine stark modifizierte Version von http://snipplr.com/view.php?codeview&id=2734.

URL-Struktur:

planen://Benutzername Passwort@domain: port / pfad? query_string #fragment_id

Die fett gedruckten Teile werden von der Funktion nicht berücksichtigt

Anmerkungen:

  • Diese Funktion beinhaltet nicht username:password von einer vollständigen URL oder dem Fragment (Hash).
  • Der Standardport 80 für HTTP und Port 443 für HTTPS wird nicht angezeigt.
  • Nur getestet mit http und https Schemata.
  • Das #fragment_id wird nicht vom Client (Browser) an den Server gesendet und nicht zur vollständigen URL hinzugefügt.
  • $_GET wird nur enthalten foo=bar2 für eine URL wie /example?foo=bar1&foo=bar2.
  • Einige CMS und Umgebungen werden neu geschrieben $_SERVER['REQUEST_URI'] und zurück /example?foo=bar2 für eine URL wie /example?foo=bar1&foo=bar2, benutzen $_SERVER['QUERY_STRING'] in diesem Fall.
  • Beachten Sie, dass ein URI = URL + URN, aber aufgrund der weit verbreiteten Verwendung bedeutet URL jetzt sowohl URI als auch URL.
  • Sie sollten entfernen HTTP_X_FORWARDED_HOST wenn Sie nicht beabsichtigen, Proxies oder Balancer zu verwenden.
  • Das Spez sagt, dass die Host Header muss die Portnummer enthalten, es sei denn, es ist die Standardnummer.

Vom Client (Browser) gesteuerte Variablen:

  • $_SERVER['REQUEST_URI']. Nicht unterstützte Zeichen werden vor dem Senden vom Browser verschlüsselt.
  • $_SERVER['HTTP_HOST'] und ist laut den Kommentaren im PHP-Handbuch nicht immer verfügbar: http://php.net/manual/en/reserved.variables.php
  • $_SERVER['HTTP_X_FORWARDED_HOST'] wird von Balancern gesetzt und ist in der Liste nicht aufgeführt $_SERVER Variablen im PHP-Handbuch.

Servergesteuerte Variablen:

  • $_SERVER['HTTPS']. Der Client wählt dies, aber der Server gibt den tatsächlichen Wert entweder leer oder "an" zurück.
  • $_SERVER['SERVER_PORT']. Der Server akzeptiert nur erlaubte Nummern als Ports.
  • $_SERVER['SERVER_PROTOCOL']. Der Server akzeptiert nur bestimmte Protokolle.
  • $_SERVER['SERVER_NAME'] . Sie wird in der Serverkonfiguration manuell eingestellt und ist für IPv6 nicht verfügbar Kraljak.

Verbunden:

HTTP_HOST vs. SERVER_NAME
Ist die Portnummer im Header-Parameter "Host" von HTTP erforderlich?
https://stackoverflow.com/a/28049503/175071


357
2018-01-17 08:57



Sehen Sie sich dazu das gesamte Array an print_r($_SERVER)Du wirst alles sehen, was du brauchst :)


190
2017-07-20 21:35



Beispiele für 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__;

Beachten!:

  • hastag (# ...) URL Teile können nicht von PHP (serverseitig) erkannt werden. Verwenden Sie dazu Javascript.
  • DIRECTORY_SEPARATOR kehrt zurück \ für Windows-Typ-Hostings, statt /.



Für 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



Hier ist eine Lösung mit a ternäre Aussageden Code minimal halten:

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

Dies ist der kleinste und einfachste Weg, dies zu tun, vorausgesetzt, der Webserver verwendet den Standardport 443 für HTTPS.


54
2018-04-24 13:30



Meine bevorzugte Cross-Plattform-Methode zum Auffinden der aktuellen URL ist:

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

39
2018-05-18 01:54



Einfach verwenden:

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

Hinweis: Ich habe gerade den Code von "Timo Huovinen" aktualisiert, damit Sie keine URLs erhalten. Diese URL ist einfach und entfernt Dinge wie "? Hi = i & am = a & get".

Beispiel:

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

wird angezeigt als:

http://www.website.com/index

Wenn Sie Get's nicht verwenden, um bestimmte Inhalte zu definieren, verwenden Sie seinen Code! :-)


16
2017-10-26 13:15



Clear Code, funktioniert in allen Webservern (Apache, nginx, IIS, ...):

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

13
2018-04-27 15:57



Hier ist meine Lösung - Code ist inspiriert von Tracy Debugger. Es wurde geändert, um verschiedene Serverports zu unterstützen. Sie können die vollständige aktuelle URL einschließlich erhalten $_SERVER['REQUEST_URI'] oder nur die grundlegende Server-URL. Prüfe meine Funktion:

function getCurrentUrl($full = true) {
    if (isset($_SERVER['REQUEST_URI'])) {
        $parse = parse_url(
            (isset($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'off') ? 'https://' : 'http://') .
            (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : (isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : '')) . (($full) ? $_SERVER['REQUEST_URI'] : null)
        );
        $parse['port'] = $_SERVER["SERVER_PORT"]; // Setup protocol for sure (80 is default)
        return http_build_url('', $parse);
    }
}

Hier ist der Testcode:

// Follow $_SERVER variables was set only for test
$_SERVER['HTTPS'] = 'off'; // on
$_SERVER['SERVER_PORT'] = '9999'; // Setup
$_SERVER['HTTP_HOST'] = 'some.crazy.server.5.name:8088'; // Port is optional there
$_SERVER['REQUEST_URI'] = '/150/tail/single/normal?get=param';

echo getCurrentUrl();
// http://some.crazy.server.5.name:9999/150/tail/single/normal?get=param

echo getCurrentUrl(false);
// http://some.crazy.server.5.name:9999/

10
2017-08-07 10:41