975 Stimmen

Abrufen der vollständigen 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 .htaccess Daher ist der in der URL angegebene Pfad nicht immer der tatsächliche Pfad der Datei.

Was ich brauche, ist die URL, das, was in der URL steht, nicht mehr und nicht weniger - die vollständige URL.

Ich muss wissen, wie die Datei in der Navigationsleiste des Webbrowsers angezeigt wird, und nicht den tatsächlichen Pfad der Datei auf dem Server.

0 Stimmen

Schauen Sie sich doch einfach mal das gesamte Array mit print_r($_SERVER) Dort finden Sie alles, was Sie brauchen :)

24 Stimmen

@Brade Die URL-Leiste befindet sich auf dem Browser des Benutzers, warum sollte PHP also irgendwelche Funktionalitäten diesbezüglich haben? PHP ist serverseitig.

33 Stimmen

@eis Glauben Sie mir, es gibt viele Gründe, dies zu wollen. Landingpages, die dieselbe Vorlage verwenden, aber separat verfolgt werden müssen, usw. Und Tatsache ist, dass PHP (oder jede andere serverseitige Sprache) alle verschiedenen Teile der URL zurückgeben kann, aber niemals das Ganze in einem String bereitstellen kann. Das erscheint einfach dumm.

2523voto

ax. Punkte 56071

Werfen Sie einen Blick auf $_SERVER['REQUEST_URI'] d.h.

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

(Beachten Sie, dass die Syntax für doppelte Anführungszeichen wie folgt lautet vollkommen korrekt )

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

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

Anmerkung der Redaktion: Die Verwendung dieses Codes hat Sicherheitsimplikationen . Der Client kann HTTP_HOST und REQUEST_URI auf jeden beliebigen Wert setzen.

485voto

Timo Huovinen Punkte 49275

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="' . $escaped_url . '">' . $escaped_url . '</a>';

Im Folgenden finden Sie einige weitere Einzelheiten 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 (die nicht mehr existiert)

URL-Struktur:

Schema:// benutzername:passwort @domain:port/path?query_string# fragment_id

Die fettgedruckten Teile werden von der Funktion nicht berücksichtigt

Anmerkungen:

  • Diese Funktion umfasst nicht username:password aus einer vollständigen URL oder dem Fragment (Hash).
  • Der Standard-Port 80 für HTTP und Port 443 für HTTPS wird nicht angezeigt.
  • Nur mit http- und https-Schemata getestet.
  • En #fragment_id wird vom Client (Browser) nicht an den Server gesendet und wird 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 schreiben die $_SERVER['REQUEST_URI'] und Rückkehr /example?foo=bar2 für eine URL wie /example?foo=bar1&foo=bar2 verwenden $_SERVER['QUERY_STRING'] in diesem Fall.
  • Denken Sie daran, dass ein URI \= URL + URN Aufgrund des allgemeinen Sprachgebrauchs bedeutet URL jetzt sowohl URI als auch URL.
  • Sie sollten Folgendes entfernen HTTP_X_FORWARDED_HOST wenn Sie nicht vorhaben, Proxys oder Balancer zu verwenden.
  • En spec sagt, dass die Host Header muss die Portnummer enthalten, es sei denn, es handelt sich um die Standardnummer.

Client (Browser) kontrollierte Variablen:

  • $_SERVER['REQUEST_URI'] . Nicht unterstützte Zeichen werden vom Browser kodiert, bevor sie gesendet werden.
  • $_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 nicht in der Liste der $_SERVER Variablen im PHP-Handbuch.

Servergesteuerte Variablen:

  • $_SERVER['HTTPS'] . Der Client wählt dies aus, 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'] . Sie wird manuell in der Serverkonfiguration eingestellt und ist für IPv6 nicht verfügbar, da kralyk .

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

285voto

T.Todua Punkte 48569

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 the 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__;

Achtung!

  • Der Hashtag # Teile wurden im obigen Beispiel nur zur Veranschaulichung manuell verwendet, allerdings können serverseitige Sprachen (einschließlich PHP) diese nicht von Haus aus erkennen (nur JavaScript kann das, da der Hashtag nur Browser-/Client-Seite Funktionalität).
  • DIRECTORY_SEPARATOR gibt zurück. \ für Windows-Hosting anstelle von / .

____

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/

71voto

honyovk Punkte 2649

Hier ist eine Lösung mit einer ternäre Anweisung und halten den Code minimal:

$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 Standard-Port 443 für HTTPS .

48voto

Daniel Gillespie Punkte 547

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

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X