Holen Sie sich die vollständige URL in PHP

Lesezeit: 11 Minuten

Holen Sie sich die vollstandige URL in PHP
DiegoP.

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 verwende .htaccesswas wir also in der URL sehen, ist nicht immer der tatsächliche Pfad der Datei.

Was ich brauche, ist die URL, was in der URL steht, 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.

  • Die @Brade-URL-Leiste befindet sich im Benutzerbrowser. Warum sollte PHP diesbezüglich irgendwelche Funktionen haben? PHP ist serverseitig.

    – eis

    19. Oktober 2013 um 11:53 Uhr

  • @eis Glauben Sie mir, es gibt viele Gründe, dies zu wollen. Zielseiten, die dieselbe Vorlage verwenden, aber separat verfolgt werden müssen usw. Und Tatsache ist, dass PHP (oder jede serverseitige Sprache) alle verschiedenen Teile der URL zurückgeben kann, aber anscheinend nie das Ganze in einer Zeichenfolge bereitstellt . Es wirkt einfach doof.

    – Brade

    29. Oktober 2013 um 19:14 Uhr

  • Das Ganze wird nie an die Serverseite gesendet, da es keine Rolle spielen sollte, weshalb es nirgendwo leicht verfügbar ist. Ich würde jede Funktion, die sich darauf stützt, als defekt betrachten. Aber das ist nur meine Meinung.

    – eis

    29. Oktober 2013 um 20:31 Uhr

  • Mein obiges Beispiel für die Notwendigkeit einer Selbst-URL: “Ausfüllen von FORM-Aktions-URLs” kann falsch sein, da PHP_SELF (nur Pfad, ohne Domain usw.) dafür ausreichen sollte. Dies bedeutet jedoch nicht unbedingt, dass alle anderen Anforderungen für die kanonische Selbst-URL ungültig sind. Wenn sie es tatsächlich sind, wäre es großartig, eine gründliche Erklärung zu sehen, warum.

    – Gr.

    7. Dezember 2013 um 12:58 Uhr

  • Einer der Gründe, warum Sie Ihre URL nicht in der Konfiguration hartcodieren sollten, ist, wenn Sie verschiedene Plattformen haben, auf denen Ihr Projekt installiert wird (Entwicklung, Integration, Produktion). Jeder von ihnen hat seine spezifische URL, und Sie möchten Ihren Code nicht entsprechend dem Server ändern, auf dem Ihr Projekt installiert ist.

    – Guillaume Fache

    27. April 2016 um 7:40 Uhr


Holen Sie sich die vollstandige URL in PHP
Axt.

Schau mal rein $_SERVER['REQUEST_URI']dh

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

(Beachten Sie, dass die Zeichenfolgensyntax in doppelten Anführungszeichen lautet vollkommen richtig)

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 des Herausgebers: mit diesem Code hat Auswirkungen auf die Sicherheit. Der Client kann HTTP_HOST und REQUEST_URI auf jeden beliebigen Wert setzen, den er möchte.

  • Was ist, wenn Sie sich auf einem https-Link befinden? Was ist, wenn HTTP_HOST nicht verfügbar ist oder vom Client manipuliert wurde? Diese Antwort scheint unvollständig und unzuverlässig.

    – Manachi

    5. April 2013 um 2:07 Uhr


  • Sie können nicht viel dagegen tun, dies ist die richtige Methode für die gestellte Frage.

    – Mfo

    27. April 2013 um 12:45 Uhr


  • Sie können einfach die Überprüfung von HTTPS hinzufügen: 'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . '://' . "{$_SERVER['HTTP_HOST']}/{$_SERVER['REQUEST_URI']}"

    – ivkremer

    22. Februar 2014 um 21:33 Uhr

  • Wenn Sie die URL als Link an einen Browser ausgeben, lassen Sie http: einfach weg. Siehe: stackoverflow.com/questions/4978235

    – GameCharmer

    26. Februar 2014 um 12:34 Uhr

  • Diese Kommentare beider Parteien tragen nicht mehr zum ursprünglichen Beitrag bei und bieten keinen Mehrwert. Der Tooltip auf „Kommentar hinzufügen“ besagt „Kommentare verwenden, um nach weiteren Informationen zu fragen oder Verbesserungen vorzuschlagen“. Bitte halten Sie sich daran.

    – Darren Felton

    6. August 2014 um 17:16 Uhr


1647072252 348 Holen Sie sich die vollstandige URL in PHP
Timo Huovinen

Kurzversion zur Ausgabe eines Links auf einer Webseite

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

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

Hier sind einige weitere Details zu den Problemen und Grenzfä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, "https://stackoverflow.com/" ) ) . ( ( $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 (was nicht mehr existiert)

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 aus einer vollständigen URL oder dem Fragment (Hash).
  • Der Standardport 80 für HTTP und Port 443 für HTTPS wird nicht angezeigt.
  • Nur mit http- und https-Schemata getestet.
  • Die #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=bar2verwenden $_SERVER['QUERY_STRING'] in diesem Fall.
  • Denken Sie daran, dass ein URI = URL + URNaber aufgrund der weit verbreiteten Verwendung bedeutet URL jetzt sowohl URI als auch URL.
  • Sie sollten entfernen HTTP_X_FORWARDED_HOST wenn Sie nicht vorhaben, Proxys oder Balancer zu verwenden.
  • Die spez sagt, dass die Host Header muss die Portnummer enthalten, es sei denn, es handelt sich um die Standardnummer.

Vom Client (Browser) gesteuerte Variablen:

  • $_SERVER['REQUEST_URI']. Alle nicht unterstützten Zeichen werden vom Browser verschlüsselt, bevor sie gesendet werden.
  • $_SERVER['HTTP_HOST'] und ist laut 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 nicht in der Liste der aufgeführt $_SERVER Variablen im PHP-Handbuch.

Servergesteuerte Variablen:

  • $_SERVER['HTTPS']. Der Client entscheidet sich dafür, dies zu verwenden, aber der Server gibt den tatsächlichen Wert entweder leer oder “on” zurück.
  • $_SERVER['SERVER_PORT']. Der Server akzeptiert nur zulässige Nummern als Ports.
  • $_SERVER['SERVER_PROTOCOL']. Der Server akzeptiert nur bestimmte Protokolle.
  • $_SERVER['SERVER_NAME'] . Es wird manuell in der Serverkonfiguration gesetzt und steht laut kralyk nicht für IPv6 zur Verfügung.

Verwandt:

Was ist der Unterschied zwischen HTTP_HOST und SERVER_NAME in PHP?
Ist die Portnummer im HTTP-Header-Parameter „Host“ erforderlich?
https://stackoverflow.com/a/28049503/175071

  • Dieser Code schlägt fehl, wenn der Server eine IPv6-IP-Adresse erhält. Um das zu beheben, ersetzen Sie SERVER_NAME durch HTTP_HOST.

    – kralyk

    22. November 2012 um 17:05 Uhr

  • Hinweis: $_SERVER['REQUEST_URI'] wird zeigen /example?foo=bar2 für URL wie /example?foo=bar1&foo=bar2

    – Timo Huovinen

    9. Mai 2013 um 13:36 Uhr

  • Dies würde nichts enthalten, was nach einem # definiert ist, diese werden nicht an den Server weitergegeben

    – Wilhelm König

    5. Juni 2013 um 18:57 Uhr

  • Ich bin mir nicht sicher, ob das kein Sicherheitsrisiko ist. In Ihrem Beispiel können Sie den Host-Header senden, um die richtige Seite zu erreichen, aber die Seite denken lassen, dass sie über einen anderen Host aufgerufen wird, indem Sie den HTTP_X_FORWARDED_HOST-Header verwenden. Wenn die Anwendung diese Informationen (für was auch immer) verwendet, kann dies tatsächlich ein Sicherheitsproblem darstellen, da Sie damit etwas versprechen können, was nicht der Fall ist.

    – hek2mgl

    6. Dezember 2013 um 11:08 Uhr

  • @Matt3o12 Der Wert des Ports wird direkt aus der übernommen Host Header, habe es nicht so eingestellt gesehen, danke für die Erwähnung, werde es als Optimierung hinzufügen

    – Timo Huovinen

    25. April 2014 um 20:19 Uhr


Holen Sie sich die vollstandige URL in PHP
T.Todua

Beispiele für: https://(www.)example.com/subFolder/myfile.php?var=blabla#555

// ======= PATHINFO ====== //
$x = pathinfo($url);
$x['dirname']      🡺 https://example.com/subFolder
$x['basename']     🡺                               myfile.php?var=blabla#555 // Unsecure! 
$x['extension']    🡺                                      php?var=blabla#555 // Unsecure! 
$x['filename']     🡺                               myfile

// ======= PARSE_URL ====== //
$x = parse_url($url);
$x['scheme']       🡺 https
$x['host']         🡺         example.com
$x['path']         🡺                    /subFolder/myfile.php
$x['query']        🡺                                          var=blabla
$x['fragment']     🡺                                                     555

//=================================================== //
//========== 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["SERVER_NAME"]
$_SERVER["REQUEST_URI"]    🡺                       /subFolder/myfile.php?var=blabla
$_SERVER["QUERY_STRING"]   🡺                                             var=blabla
__FILE__                   🡺 /home/user/public_html/subFolder/myfile.php
__DIR__                    🡺 /home/user/public_html/subFolder              //same: dirname(__FILE__)
$_SERVER["REQUEST_URI"]    🡺                       /subFolder/myfile.php?var=blabla
parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH)🡺  /subFolder/myfile.php 
$_SERVER["PHP_SELF"]       🡺                       /subFolder/myfile.php

// ==================================================================//
//if "myfile.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?var=blabla
__FILE__                   🡺 /home/user/public_html/subFolder/myfile.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)             🡺 myfile.php

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

Notiz ! ! !

  • Hashtag # Teile wurden im obigen Beispiel nur zu Illustrationszwecken manuell verwendet, serverseitige Sprachen (einschließlich php) können sie nicht nativ erkennen (nur Javascript kann das, da hashtag nur ist browser/client side Funktionalität).
  • DIRECTORY_SEPARATOR kehrt zurück \ für Hosting vom Typ Windows 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/  

  • Wo ist der Teil #, gibt es keine Möglichkeit, auf den Teil nach # auf der Serverseite zuzugreifen?

    – Rohit Khatri

    8. August 2016 um 7:01 Uhr


  • @RohitKhatri dieser Teil ist nur im Browser zugänglich und wird nicht an den Server gesendet

    – beppe9000

    24. Dezember 2019 um 13:53 Uhr

  • Was ist die WordPress-Funktion, um die URL auch mit der Abfragezeichenfolge zu erhalten?

    – beppe9000

    24. Dezember 2019 um 13:54 Uhr

  • WARNEN: pathinfo() verhält sich nicht mit komplexer URList wie erwartet – obwohl / Zeichen ist in Parametern nicht streng verboten (siehe stackoverflow.com/questions/1455578/…), das Analysieren einer solchen URL gibt Ihnen keinen Skript-Basisnamen/Dateinamen. Versuchen print_r(pathinfo("https://example.com/subFolder/myfile.php?var=path/to/another/file.png"));

    – Jiří

    17. August 2021 um 10:17 Uhr


1647072252 787 Holen Sie sich die vollstandige URL in PHP
Honigovk

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 eigene Webserver verwendet den Standardport 443 für HTTPS.

1647072253 307 Holen Sie sich die vollstandige URL in PHP
Daniel Gillespie

Meine bevorzugte plattformübergreifende Methode zum Auffinden der aktuellen URL ist:

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

  • Schließen, aber ich musste es folgendermaßen ändern: $url = ((isset($_SERVER[‘HTTPS’]) && $_SERVER[‘HTTPS’] !== ‘aus’) ? “https” : “http”) . “://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]”;

    – Erik Allen

    12. Februar 2016 um 16:46 Uhr

1647072253 385 Holen Sie sich die vollstandige URL in PHP
Peter Mortensen

Einfach verwenden:

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

  • Schließen, aber ich musste es folgendermaßen ändern: $url = ((isset($_SERVER[‘HTTPS’]) && $_SERVER[‘HTTPS’] !== ‘aus’) ? “https” : “http”) . “://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]”;

    – Erik Allen

    12. Februar 2016 um 16:46 Uhr

1647072253 180 Holen Sie sich die vollstandige URL in PHP
TRIG

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, "https://stackoverflow.com/")) . (($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, sodass Sie keine GET-Parameter in der URL erhalten. Diese URL ist einfach und entfernt Dinge wie ?hi=i&am=a&get.

Beispiel:

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

wird angezeigt als:

http://www.example.com/index

Dies ist in Ordnung, es sei denn, Sie verwenden GET-Parameter, um einen bestimmten Inhalt zu definieren. In diesem Fall sollten Sie seinen Code verwenden! 🙂

  • Hey, das ist ziemlich cool 🙂 Sie könnten auch alles nach einem Hash “#” (URL-Fragment) entfernen, falls es irgendwie hineinrutscht

    – Timo Huovinen

    22. November 2012 um 18:37 Uhr

  • Nicht wirklich, denn wenn Sie ” explode(‘#’,$segment[0]) “, wird dies als Fehler gewertet, da das Symbol ” # ” die URL unterbricht und nur von Javascript gelesen werden kann. Was Sie jedoch tun können, ist, dass Sie das ” return $url; ” mit ” return trim($url,’#’); “, denn dann werden Sie es entfernen, falls es dort sein sollte. Aber es wird nicht den folgenden Inhalt entfernen. Sie können auf “Parse_url” nachlesen, wenn Sie möchten. 🙂

    – Alex Westergaard

    28. November 2012 um 17:27 Uhr


993100cookie-checkHolen Sie sich die vollständige URL in PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy