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
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.
12 Stimmen
Das Ganze wird nie an die Serverseite gesendet, da es keine Rolle spielen sollte, weshalb es auch nirgendwo leicht verfügbar ist. Ich würde jede Funktionalität, die sich darauf verlässt, als kaputt ansehen. Aber das ist nur meine Meinung.
3 Stimmen
Das in der Frage ausgedrückte Bedürfnis (vollständige URL, wie in der Adressleiste) stellt das eigentliche Problem in den Schatten: Wenn man zufällig die "Selbst-URL" einer Seite auf dem Server benötigt (aus welchem Grund auch immer, z. B. zum Ausfüllen von FORM-Aktions-URLs), wäre es sicherlich besser, sie vom Server zu erhalten (z. B. $_SERVER), als zu versuchen, sie aus Bits und Stücken auf willkürliche, gefälschte Art und Weise zusammenzusetzen (wie häufig zu beobachten). Diese URL wäre zumindest korrekt, wenn auch nur eine "effektive URL", nicht unbedingt die exakte Kopie der Adressleiste (die in der Tat außerhalb der Reichweite des Servers liegt).
5 Stimmen
Mein obiges Beispiel für den Bedarf an einer eigenen URL: "Füllen von FORM-Aktions-URLs" ist vielleicht falsch, da PHP_SELF (nur Pfad, ohne Domain usw.) dafür ausreichen sollte. Aber das bedeutet nicht unbedingt, dass alle anderen Anforderungen an die kanonische Selbst-URL ungültig sind. Wenn dies tatsächlich der Fall ist, wäre es toll, eine ausführliche Erklärung zu sehen, warum.
0 Stimmen
@lunakid es ist oft praktisch, die aktuelle URL zu nehmen, sie zu analysieren und einige weitere Parameter hinzuzufügen, es wäre besser, wenn das System in der Lage wäre, eine kanonische URL für jede Seite selbst zu erzeugen, aber das ist oft lächerlich schwer zu erreichen.
0 Stimmen
Ich verstehe nicht, warum man den vollständigen Pfad nicht in der Konfigurationsdatei selbst fest eintippen kann? Darauf wird überall in den Anwendungen zugegriffen, und es gibt dort auch andere fest kodierte Dinge, wie z.B. db name, user und pass. Warum sollte man Rechenleistung verschwenden, um den vollständigen Pfad herauszufinden, der leicht gefälscht werden kann, indem man einen anderen HTTP_HOST sendet?
4 Stimmen
Einer der Gründe, warum Sie Ihre URL in der Konfiguration nicht fest codieren sollten, ist, dass Sie verschiedene Plattformen haben, auf denen Ihr Projekt installiert werden soll (Dev, Integration, Production). Jede dieser Plattformen hat ihre eigene URL, und Sie möchten Ihren Code nicht ändern, je nachdem, auf welchem Server Ihr Projekt installiert ist.
0 Stimmen
Eine einfachere Lösung könnte hoffentlich mit PHP 7.2+ (vorgeschlagene Version) kommen wiki.php.net/rfc/replace_parse_url
0 Stimmen
@KaiNoack Wie würde ein Ersatz für
parse_url(url)
das Problem lösen, zuerst die Url zu erhalten?