Ich erstelle eine PHP-Anwendung in CodeIgniter. CodeIgniter sendet alle Anforderungen an den Hauptcontroller : index.php
. Ich mag es jedoch nicht, index.php
in der URI zu sehen. Zum Beispiel http://www.example.com/faq/whatever
wird zu routen http://www.example.com/index.php/faq/whatever
. Ich brauche eine zuverlässige Methode, damit ein Skript weiß, wie seine Adresse lautet, damit es weiß, was mit der Navigation zu tun ist. Ich habe mod_rewrite
gemäß CodeIgniter-Dokumentation verwendet.
Die Regel lautet wie folgt:
RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
Normalerweise würde ich nur nachsehen php_self
, aber in diesem Fall ist es immer so index.php
. Ich kann es von bekommen REQUEST_URI
, PATH_INFO
etc., aber ich versuche zu entscheiden , welche die zuverlässigste sein wird. Hat jemand wissen (oder wissen , wo zu finden) , um den Unterschied zwischen PHP_SELF
, PATH_INFO
, SCRIPT_NAME
und REQUEST_URI
? Danke für Ihre Hilfe!
Hinweis : Ich musste Leerzeichen hinzufügen, da SO den Unterstrich sieht und ihn aus irgendeinem Grund kursiv macht.
Aktualisiert : Die Leerzeichen wurden korrigiert.
quelle
Einige praktische Beispiele für die Unterschiede zwischen diesen Variablen:
Beispiel 1. PHP_SELF unterscheidet sich von SCRIPT_NAME nur, wenn die angeforderte URL in der folgenden Form vorliegt:
http://example.com/test.php/foo/bar
(Dies scheint der einzige Fall zu sein, in dem PATH_INFO sinnvolle Informationen enthält [PATH_INFO] => / foo / bar) Hinweis: Dies war in einigen älteren PHP-Versionen (<= 5.0?) anders.
Beispiel 2. REQUEST_URI unterscheidet sich von SCRIPT_NAME, wenn eine nicht leere Abfragezeichenfolge eingegeben wird:
http://example.com/test.php?foo=bar
Beispiel 3. REQUEST_URI unterscheidet sich von SCRIPT_NAME, wenn die serverseitige Umleitung aktiviert ist (z. B. mod_rewrite für Apache):
http://example.com/test.php
Beispiel 4. REQUEST_URI unterscheidet sich von SCRIPT_NAME, wenn HTTP-Fehler mit Skripten behandelt werden.
Verwenden der Apache-Direktive ErrorDocument 404 /404error.php
http://example.com/test.php
Auf einem IIS-Server mit benutzerdefinierten Fehlerseiten
http://example.com/test.php
quelle
/
am Ende desSCRIPT_NAME
. Dies scheint in PHP 5.2-5.4 konsistent zu sein, wenn man bedenkt, dass die Antwort bearbeitet wird, um dies widerzuspiegeln.PATH_INFO
ist nur verfügbar, wenn htaccess wie folgt verwendet wird:Beispiel 1
Bleibt das selbe
Wurzel
http://domain.com/
Pfad
http://domain.com/test
Abfragezeichenfolge
http://domain.com/test?123
Beispiel 2
Bleibt das selbe
Wurzel
http://domain.com/
Pfad
http://domain.com/test
Abfragezeichenfolge
http://domain.com/test?123
Beispiel 3
oder
Bleibt das selbe
Wurzel
http://domain.com/
Pfad
http://domain.com/test
Sprache
http://domain.com/de
Sprachpfad
http://domain.com/de/test
Sprachabfragezeichenfolge
http://domain.com/de/test?123
quelle
PHP-Pfade
$_SERVER['REQUEST_URI']
= Webpfad, angeforderter URI$_SERVER['PHP_SELF']
= Webpfad, angeforderte Datei + Pfadinfo$_SERVER['SCRIPT_NAME']
= Webpfad, angeforderte Datei$_SERVER['SCRIPT_FILENAME']
= Dateipfad, angeforderte Datei__FILE__
= Dateipfad, aktuelle DateiWo
/var/www/index.php
nach der Aliasauflösung/index.php
vonhttp://foo.com/index.php
und entspricht möglicherweise nicht einmal einer Datei/index.php?foo=bar
vor dem Umschreiben einer URLReihenfolge der Bedienung
REQUEST_URI
PHP_SELF
PHP_SELF
inSCRIPT_FILENAME
+PATH_INFO
SCRIPT_FILENAME
__FILE__
auf den Pfad zur aktuellen Datei verwiesen wirdquelle
$_SERVER['SCRIPT_NAME']
und$_SERVER['PHP_SELF']
, da mod_rewrite den gesamten Pfad erstellen, das heißt$_SERVER['PHP_SELF']
. Die Trennung erfolgt als nächstes. Beachten Sie, dass Aliase auch den gesamten Pfad zum Definieren des Skriptdateinamens berücksichtigen, die Trennung von Skriptname und Pfadinfo jedoch bereits erfolgt ist, sodass sie nicht betroffen sind.Möglicherweise möchten Sie einen Blick in die URI-Klasse werfen und $ this-> uri-> uri_string () verwenden
Gibt eine Zeichenfolge mit dem vollständigen URI zurück.
Wenn dies beispielsweise Ihre vollständige URL ist:
Die Funktion würde dies zurückgeben:
Sie können die Segmente auch verwenden, um einen Drilldown für bestimmte Bereiche durchzuführen, ohne Parsing- / Regex-Werte erstellen zu müssen
quelle
Persönlich verwende ich das,
$REQUEST_URI
da es auf den eingegebenen URI verweist und nicht auf den Speicherort auf der Server-CD.quelle
Zu Odins Antwort gibt es sehr wenig hinzuzufügen. Ich wollte nur ein vollständiges Beispiel von der HTTP-Anforderung für die eigentliche Datei im Dateisystem bereitstellen, um die Auswirkungen des Umschreibens von URLs und Aliasnamen zu veranschaulichen. Das Skript auf dem Dateisystem
/var/www/test/php/script.php
istwo
/var/www/test/php/script_included.php
istund
/var/www/test/.htaccess
istund die Apache-Konfigurationsdatei enthält den Alias
und die http Anfrage ist
Die Ausgabe wird sein
Folgendes gilt immer
Wenn es kein Umschreiben von mod_rewrite, mod_dir, ErrorDocument oder irgendeine Form des Umschreibens von URLs gibt, haben wir auch
Die Aliase wirken sich auf die Systemdateipfade
SCRIPT_FILENAME
und__FILE__
nicht auf die zuvor definierten URL-Pfade aus - siehe Ausnahmen unten. Aliase verwenden möglicherweise den gesamten URL-Pfad, einschließlichPATH_INFO
. Es konnte überhaupt keine Verbindung zwischenSCRIPT_NAME
und gebenSCRIPT_FILENAME
.Es ist nicht ganz genau, dass Aliase zum Zeitpunkt der
[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
Definition des URL-Pfads nicht aufgelöst werden , da Aliase für die Suche im Dateisystem in Betracht gezogen werden und wir aus Beispiel 4 in Odins Antwort wissen, dass das Dateisystem durchsucht wird, um festzustellen, ob die Datei vorhanden ist. Dies ist jedoch nur relevant, wenn die Datei nicht gefunden wird. In ähnlicher Weise ruft mod_dir mod_alias auf, um das Dateisystem zu durchsuchen. Dies ist jedoch nur relevant, wenn Sie einen Alias wie habenAlias \index.php \var\www\index.php
und die Anforderungs-URL ein Verzeichnis ist.quelle
Wenn Sie jemals vergessen, welche Variablen was tun, können Sie ein kleines Skript schreiben, das verwendet phpinfo () verwendet, und es von einer URL mit einer Abfragezeichenfolge aufrufen. Da Serversoftwareinstallationen die von PHP zurückgegebenen Variablen enthalten, ist es immer eine gute Idee, die Ausgabe des Computers zu überprüfen, falls das Umschreiben in der Serverkonfigurationsdatei zu anderen Ergebnissen führt als erwartet. Speichern Sie es als etwas wie
_inf0.php
:Dann würden Sie anrufen
/_inf0.php?q=500
quelle
Sichern Sie eine Sekunde, Sie haben zunächst den falschen Ansatz gewählt. Warum nicht einfach so machen?
stattdessen? Dann schnapp es dir mit
$_GET['url'];
quelle
QSA
Abfragezeichenfolgen ( Flag) zusammenführen, können Abfragezeichenfolgenparameter möglicherweise überschrieben werden (z. B. wenn Sieurl
bei der ersten Anforderung einen Parameter benötigt haben ) oder, schlimmer noch, anfällig für XSS-Angriffe sein.