In der PHP -Entwicklung ist Parse_url () eine sehr häufige Funktion, mit der URLs in ihre Komponenten wie Schema, Host, Port, Pfad, Abfrage usw. zerlegt werden. Wenn wir jedoch mit Localhost- oder Intranet -Adressen umgehen (wie 192,168.xx, 10.xxx, oder 127.0.0.1). standardisiert.
Parse_url () erhält eine URL -Zeichenfolge und gibt ein assoziatives Array zurück, das die verschiedenen Komponenten der URL enthält:
$url = "http://localhost:8080/test/index.php?foo=bar";
$parsed = parse_url($url);
print_r($parsed);
Das Ausgabeergebnis ist wie folgt:
Array
(
[scheme] => http
[host] => localhost
[port] => 8080
[path] => /test/index.php
[query] => foo=bar
)
Dies bedeutet, dass Localhost korrekt als Hostname erkannt wird und der Port-, Pfad- und Abfrageparameter ebenfalls erfolgreich extrahiert werden.
Ohne ein Schema (z. B. http: // ) ändert sich das Verhalten von Parse_url () , insbesondere wenn sie mit URLs wie Lokalhost/Test zu tun haben. Zum Beispiel:
$url = "localhost/test";
$parsed = parse_url($url);
print_r($parsed);
Die Ausgabe kann sein:
Array
(
[path] => localhost/test
)
Zu diesem Zeitpunkt wird Localhost fälschlicherweise als Teil des Pfades behandelt, nicht als Hostname. Damit Parse_url () den Host korrekt erkennen kann, muss die URL mit Schema: // beginnen.
Lösung: Stellen Sie vor Verwendung von Parse_url () sicher, dass die URL das vollständige Schema enthält, zum Beispiel:
if (!preg_match('#^[a-zA-Z][a-zA-Z0-9+.-]*://#', $url)) {
$url = 'http://' . $url;
}
$parsed = parse_url($url);
Intranet -Adressen (z. B. 192.168.1.1 oder 10.0.0.2) haben keine Probleme mit dem Schema:
$url = "http://192.168.1.100/dashboard";
$parsed = parse_url($url);
Der Ausgang ist normal:
Array
(
[scheme] => http
[host] => 192.168.1.100
[path] => /dashboard
)
Schlüsselpunkt: Selbst für IP -Adressen muss es http: // oder andere Protokollheader enthalten.
Manchmal verfügt die Localhost -Adresse möglicherweise für Port- oder Benutzerauthentifizierungsinformationen, z. B.:
$url = "http://user:pass@localhost:8080/secure";
$parsed = parse_url($url);
Ausgabe:
Array
(
[scheme] => http
[host] => localhost
[port] => 8080
[user] => user
[pass] => pass
[path] => /secure
)
Dies zeigt, dass Parse_url () die Benutzerauthentifizierungsinformationen der Benutzer korrekt identifizieren kann. Die Prämisse ist jedoch, dass das URL -Format noch abgeschlossen ist.
Wenn Sie die Intranet -Adresse als Beispiel übernehmen, wird einer unserer internen Dienste unter http://192.168.0.88:3000/status bereitgestellt, oder die Entwicklungsumgebung verwendet http: // localhost: 8000/api , die auf folgende Weise behandelt werden kann:
$urls = [
'http://localhost:8000/api',
'192.168.0.88:3000/status', // keiner scheme
'http://user:[email protected]:9000/panel'
];
foreach ($urls as $url) {
if (!preg_match('#^[a-zA-Z][a-zA-Z0-9+.-]*://#', $url)) {
$url = 'http://' . $url;
}
$parsed = parse_url($url);
print_r($parsed);
}
Die Ausgangsergebnisse können die Komponenten jeder URL korrekt extrahieren, was für die weitere Verarbeitung, Überprüfung oder Routing und Weiterleitung bequem ist.
Bei Verwendung von Parse_url () , um Lokalhost- oder Intranet -Adressen zu analysieren, achten Sie bitte auf die folgenden Punkte:
Die URL muss ein Schema (z. B. http: // ) enthalten, andernfalls wird der Host fälschlicherweise als Pfad behandelt.
Intranet IP und Localhost können korrekt analysiert werden, solange das Format standardisiert ist.
Wenn die URL existiert, die vom Benutzer eingegeben wird, müssen Sie zuerst die URL normalisieren , z. B. das Abschluss des Schemas.
Parse_url () kann die Legitimität der URL nicht überprüfen. Es führt nur eine String -Parsen durch, und ein weiteres Urteil ist in Kombination mit filter_var () erforderlich.
Die korrekte Verwendung von Parse_url () kann uns helfen, verschiedene lokale und intranet -Service -Adressen in der Entwicklung besser zu handhaben und die Code -Robustheit und -wartbarkeit zu verbessern.