110 votes

PHP_SELF vs PATH_INFO vs SCRIPT_NAME vs REQUEST_URI

Je suis la construction d'une application PHP dans CodeIgniter. CodeIgniter envoie toutes les requêtes vers le contrôleur principal: index.php. Cependant, je n'aime pas à voir index.php dans l'URI. Par exemple, http://www.example.com/faq/whatever à http://www.example.com/index.php/faq/whatever. J'ai besoin d'un moyen fiable pour un script pour savoir ce que c'adresse de l'est, de sorte qu'il saura quoi faire avec la navigation. J'ai utilisé mod_rewrite, comme par CodeIgniter documentation.

La règle est la suivante:

RewriteEngine on
RewriteCond $1 !^(images|inc|favicon\.ico|index\.php|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L] 

Normalement, je voudrais juste vérifier php_self, mais dans ce cas, il est toujours index.php. Je peux l'obtenir à partir d' REQUEST_URI, PATH_INFO, etc., mais je suis en train de décider qui seront les plus fiables. Personne ne sait (ou savoir où trouver) la véritable différence entre PHP_SELF, PATH_INFO, SCRIPT_NAME, et REQUEST_URI? Merci pour votre aide!

Note: j'ai dû ajouter des espaces, comme le voit le trait de soulignement, et rend italique pour une raison quelconque.

Mise à jour: correction de la les espaces.

242voto

Odin Points 1579

Quelques exemples pratiques illustrant les différences entre ces variables:
Exemple 1. PHP_SELF est différente de SCRIPT_NAME seulement lors de l'url demandée est de la forme:
http://example.com/test.php/foo/bar

[PHP_SELF] => /test.php/foo/bar
[SCRIPT_NAME] => /test.php

(cela semble être le seul cas où ce genre de requête contient des informations sensibles [PATH_INFO] => /foo/bar) Remarque: cette habitude d'être différent dans certaines anciennes versions de PHP (<= 5.0 ?).

Exemple 2. REQUEST_URI est différente de SCRIPT_NAME lorsqu'un non-vide de la chaîne de requête est entré:
http://example.com/test.php?foo=bar

[SCRIPT_NAME] => /test.php
[REQUEST_URI] => /test.php?foo=bar

Exemple 3. REQUEST_URI est différente de SCRIPT_NAME côté serveur redirecton est en effet (par exemple mod_rewrite d'apache):

http://example.com/test.php

[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /test2.php

Exemple 4. REQUEST_URI est différente de SCRIPT_NAME lors de la manipulation des erreurs HTTP à l'aide de scripts.
À l'aide d'apache directive ErrorDocument 404 /404error.php
http://example.com/test.php

[REQUEST_URI] => /test.php
[SCRIPT_NAME] => /404error.php

Sur serveur IIS à l'aide des pages d'erreur personnalisées
http://example.com/test.php

[SCRIPT_NAME] => /404error.php
[REQUEST_URI] => /404error.php?404;http://example.com/test.php

53voto

Jeremy Ruten Points 59989

La documentation PHP, pouvez-vous dire la différence:

'PHP_SELF'

Le nom de fichier du script en cours d'exécution, par rapport à la racine du document. Par exemple, la variable$_SERVER['PHP_SELF'] dans un script à l'adresse http://example.com/test.php/foo.bar serait /test.php/foo.bar. L' __FICHIER__ constants contient le chemin d'accès complet et le nom de l'actuel (c'est à dire inclus) fichier. Si PHP est en cours d'exécution en ligne de commande, le processeur de cette variable contient le nom du script depuis PHP 4.3.0. Auparavant, il n'était pas disponible.

'SCRIPT_NAME'

Contient le nom du script courant. C'est utile pour les pages qui doivent pointer vers eux-mêmes. L' __FICHIER__ constants contient le chemin d'accès complet et le nom de l'actuel (c'est à dire inclus) fichier.

'REQUEST_URI'

L'URI qui a été donné afin d'accéder à cette page; par exemple, '/index.html'.

PATH_INFO ne semble pas être documentées...

25voto

Mike Points 621

PATH_INFO est disponible uniquement lors de l'utilisation de htaccess comme ceci:

Exemple 1

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

Reste le même

[SCRIPT_NAME] => /index.php

Racine

http://domain.com/

[PHP_SELF]     => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI]  => /
[QUERY_STRING] => 

Chemin

http://domain.com/test

[PHP_SELF]     => /index.php/test
[PATH_INFO]    => /test
[REQUEST_URI]  => /test
[QUERY_STRING] => 

Chaîne De Requête

http://domain.com/test?123

[PHP_SELF]     => /index.php/test
[PATH_INFO]    => /test
[REQUEST_URI]  => /test?123
[QUERY_STRING] => 123

Exemple 2

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php?url=$1 [L,QSA]

Reste le même

[SCRIPT_NAME]  => /index.php
[PHP_SELF]     => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)

Racine

http://domain.com/

[REQUEST_URI]  => /
[QUERY_STRING] => 

Chemin

http://domain.com/test

[REQUEST_URI]  => /test
[QUERY_STRING] => url=test

Chaîne De Requête

http://domain.com/test?123

[REQUEST_URI]  => /test?123
[QUERY_STRING] => url=test&123

Exemple 3

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(([a-z]{2})|(([a-z]{2})/)?(.*))$ index.php/$5 [NC,L,E=LANGUAGE:$2$4]

ou

RewriteRule ^([a-z]{2})(/(.*))?$ $3 [NC,L,E=LANGUAGE:$1]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(favicon\.ico|robots\.txt)
RewriteRule ^(.*)$ index.php/$1 [L]

Reste le même

[SCRIPT_NAME] => /index.php

Racine

http://domain.com/

[PHP_SELF]          => /index.php
[PATH_INFO] IS NOT AVAILABLE (fallback to REQUEST_URI in your script)
[REQUEST_URI]       => /
[QUERY_STRING]      => 
[REDIRECT_LANGUAGE] IS NOT AVAILABLE

Chemin

http://domain.com/test

[PHP_SELF]          => /index.php/test
[PATH_INFO]         => /test
[REQUEST_URI]       => /test
[QUERY_STRING]      => 
[REDIRECT_LANGUAGE] => 

Langue

http://domain.com/en

[PHP_SELF]          => /index.php/
[PATH_INFO]         => /
[REQUEST_URI]       => /en
[QUERY_STRING]      => 
[REDIRECT_LANGUAGE] => en

Langue de chemin

http://domain.com/en/test

[PHP_SELF]          => /index.php/test
[PATH_INFO]         => /test
[REQUEST_URI]       => /en/test
[REDIRECT_LANGUAGE] => en

La langue de la chaîne de Requête

http://domain.com/en/test?123

[PHP_SELF]          => /index.php/test
[PATH_INFO]         => /test
[REQUEST_URI]       => /en/test?123
[QUERY_STRING]      => 123
[REDIRECT_LANGUAGE] => en

5voto

Adam Points 2408

Vous voudrez peut-être examiner la classe URI et utiliser $ this-> uri-> uri_string ()

Retourne une chaîne avec l'URI complet.

Par exemple, s'il s'agit de votre URL complète:

 http://example.com/index.php/news/local/345
 

La fonction renverrait ceci:

 /news/local/345
 

Ou vous pouvez utiliser les segments pour explorer des zones spécifiques sans avoir à fournir des valeurs d'analyse / regex

4voto

Xenph Yan Points 20883

Personnellement, j'utilise $ REQUEST_URI car il fait référence à l'URI entré et non à l'emplacement sur le disque du serveur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X