Je construis une application PHP dans CodeIgniter. CodeIgniter envoie toutes les demandes au contrôleur principal: index.php
. Cependant, je n'aime pas voir index.php
dans l'URI. Par exemple, http://www.example.com/faq/whatever
acheminera vers http://www.example.com/index.php/faq/whatever
. J'ai besoin d'un moyen fiable pour qu'un script sache quelle est son adresse, afin qu'il sache quoi faire avec la navigation. J'ai utilisé mod_rewrite
, selon la documentation de CodeIgniter.
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 vérifierais simplement php_self
, mais dans ce cas, c'est toujours index.php
. Je peux l'obtenir de REQUEST_URI
, PATH_INFO
etc., mais j'essaie de décider laquelle sera la plus fiable. Ne sait quiconque (ou savoir où trouver) la vraie différence entre PHP_SELF
, PATH_INFO
, SCRIPT_NAME
et REQUEST_URI
? Merci de votre aide!
Remarque : j'ai dû ajouter des espaces, car SO voit le trait de soulignement et le met en italique pour une raison quelconque.
Mise à jour : correction des espaces.
la source
Quelques exemples pratiques des différences entre ces variables:
Exemple 1. PHP_SELF est différent de SCRIPT_NAME uniquement lorsque l'url demandée est au format :
http://example.com/test.php/foo/bar
(cela semble être le seul cas où PATH_INFO contient des informations sensibles [PATH_INFO] => / foo / bar) Remarque: cela était différent dans certaines anciennes versions de PHP (<= 5.0?).
Exemple 2. REQUEST_URI est différent de SCRIPT_NAME lorsqu'une chaîne de requête non vide est saisie:
http://example.com/test.php?foo=bar
Exemple 3. REQUEST_URI est différent de SCRIPT_NAME lorsque la redirection côté serveur est en vigueur (par exemple mod_rewrite sur apache):
http://example.com/test.php
Exemple 4. REQUEST_URI est différent de SCRIPT_NAME lors de la gestion des erreurs HTTP avec des scripts.
Utilisation de la directive Apache ErrorDocument 404 /404error.php
http://example.com/test.php
Sur le serveur IIS utilisant des pages d'erreur personnalisées
http://example.com/test.php
la source
/
à la fin duSCRIPT_NAME
. Cela semble être cohérent dans PHP 5.2-5.4 alors, en envisageant de modifier la réponse pour refléter cela.PATH_INFO
n'est disponible que lors de l'utilisation de htaccess comme ceci:Exemple 1
Reste le même
Racine
http://domain.com/
Chemin
http://domain.com/test
Chaîne de requête
http://domain.com/test?123
Exemple 2
Reste le même
Racine
http://domain.com/
Chemin
http://domain.com/test
Chaîne de requête
http://domain.com/test?123
Exemple 3
ou
Reste le même
Racine
http://domain.com/
Chemin
http://domain.com/test
Langue
http://domain.com/en
Chemin de langue
http://domain.com/en/test
Chaîne de requête de langue
http://domain.com/en/test?123
la source
Chemins PHP
$_SERVER['REQUEST_URI']
= Chemin Web, URI demandé$_SERVER['PHP_SELF']
= chemin Web, fichier demandé + info de chemin$_SERVER['SCRIPT_NAME']
= chemin Web, fichier demandé$_SERVER['SCRIPT_FILENAME']
= chemin du fichier, fichier demandé__FILE__
= chemin du fichier, fichier actuelOù
/var/www/index.php
, après la résolution d'alias/index.php
partir dehttp://foo.com/index.php
, et peut même ne correspondre à aucun fichier/index.php?foo=bar
, avant toute réécriture d'URLOrdre de fonctionnement
REQUEST_URI
PHP_SELF
PHP_SELF
enSCRIPT_FILENAME
+PATH_INFO
SCRIPT_FILENAME
__FILE__
réfère au chemin d'accès au fichier actuella source
$_SERVER['SCRIPT_NAME']
et$_SERVER['PHP_SELF']
, parce que mod_rewrite crée le chemin complet, qui est$_SERVER['PHP_SELF']
. La séparation se produit ensuite. Notez que les alias prennent également en compte le chemin complet pour définir le nom de fichier du script, mais la séparation qui a défini le nom du script et le chemin_info a déjà eu lieu, donc ils ne seront pas affectés.Vous pouvez consulter la classe URI et utiliser $ this-> uri-> uri_string ()
Renvoie une chaîne avec l'URI complet.
Par exemple, s'il s'agit de votre URL complète:
La fonction renverrait ceci:
Ou vous pouvez utiliser les segments pour explorer des zones spécifiques sans avoir à trouver des valeurs d'analyse / regex
la source
Personnellement, j'utilise le
$REQUEST_URI
car il fait référence à l'URI entré et non à l'emplacement sur le disque du serveur.la source
Il y a très peu à ajouter à la réponse d'Odin. J'ai juste eu envie de fournir un exemple complet de la requête HTTP au fichier réel sur le système de fichiers pour illustrer les effets de la réécriture d'URL et des alias. Sur le système de fichiers, le script
/var/www/test/php/script.php
estoù
/var/www/test/php/script_included.php
estet
/var/www/test/.htaccess
estet le fichier de configuration Apache inclut l'alias
et la requête http est
La sortie sera
Ce qui suit est toujours valable
S'il n'y a pas de réécriture de mod_rewrite, mod_dir, ErrorDocument ou toute forme de réécriture d'URL, nous avons également
Les alias affectent les chemins des fichiers système
SCRIPT_FILENAME
et__FILE__
non les chemins URL, qui sont définis auparavant - voir les exceptions ci-dessous. Les alias peuvent utiliser le chemin d'URL complet, y comprisPATH_INFO
. Il ne pourrait y avoir aucun lien entreSCRIPT_NAME
etSCRIPT_FILENAME
.Il n'est pas tout à fait exact que les alias ne soient pas résolus au moment où le chemin de l'URL
[PHP_SELF] = [SCRIPT_NAME] + [PATH_INFO]
est défini, car les alias sont considérés pour rechercher le système de fichiers et nous savons à partir de l'exemple 4 de la réponse d'Odin que le système de fichiers est recherché pour déterminer si le fichier existe, mais cela n'est pertinent que lorsque le fichier n'est pas trouvé. De même, mod_dir appelle mod_alias pour rechercher dans le système de fichiers, mais cela n'est pertinent que si vous avez un alias tel queAlias \index.php \var\www\index.php
et que l'URI de la requête est un répertoire.la source
Si jamais vous oubliez quelles variables font quoi, vous pouvez écrire un petit script qui utilise phpinfo () et l'appeler depuis une URL avec une chaîne de requête. Étant donné que les installations de logiciels de serveur présentent les variables renvoyées par PHP, il est toujours judicieux de vérifier la sortie de la machine au cas où les réécritures dans le fichier de configuration du serveur entraînent des résultats différents de ceux attendus. Enregistrez-le sous quelque chose comme
_inf0.php
:Alors tu appellerais
/_inf0.php?q=500
la source
Sauvegardez une seconde, vous avez d'abord adopté la mauvaise approche. Pourquoi ne pas faire ça
au lieu? Puis attrape-le avec
$_GET['url'];
la source
QSA
indicateur), les paramètres de chaîne de requête peuvent potentiellement être écrasés (par exemple, si vous aviez besoin d'unurl
paramètre lors de la requête initiale) ou pire, être vulnérables aux attaques XSS.