.htaccess issue php $ _SERVER ['PATH_INFO'] est vide [fermé]
Sur l'hôte local, j'exécutais mon application php (MVC) avec les règles suivantes dans mon .htaccessfichier:
Options -Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond $1 !^(config|core|css|js|fonts|images|robots\.txt) RewriteRule ^(.+)$ index.php/$1 [L]
Par exemple localhost/myapp/register/login, chargera la page de connexion. Mais sur un serveur en direct, j'ai des problèmes. Le premier problème auquel j'ai été confronté était No input file specified. En lisant cette réponse, j'ai changé cette ligne RewriteRule ^(.+)$ index.php/$1 [L]en RewriteRule ^(.*)$ index.php?/$1 [L]. Cela a résolu le premier problème, mais a créé un autre problème et maintenant, il charge toujours la même vue / par défaut et le même contrôleur, quelle que soit l'URL.
Mon index.php contient les lignes de code suivantes:
$url = isset($_SERVER['PATH_INFO']) ? explode('/', ltrim($_SERVER['PATH_INFO'], '/')) : [];
// Route the request
Router::route($url);
Donc, j'ai vérifié la valeur de $ _SERVER ['PATH_INFO'] et elle est vide. Maintenant, ma question est de savoir pourquoi il est vide et comment puis-je obtenir le comportement normal des URL.
Réponses
Finalement, je l'ai fait fonctionner. Mon nouveau
RewriteRuleest . J'utilise au lieu de dans mon .RewriteRule ^(.*)$ index.php?/$1 [L,QSA]$_SERVER['REQUEST_URI']$_SERVER['PATH_INFO']index.php
Si vous utilisez $_SERVER['REQUEST_URI']dans votre code PHP, vous ne devriez probablement pas ajouter une chaîne de requête (contenant le chemin de l'URL) à la RewriteRule substitution (du moins vous n'en avez pas besoin ), c'est-à-dire. Utilisez simplement à la RewriteRule . index.php [L]place.
Le $_SERVER['REQUEST_URI']superglobal PHP contient uniquement le chemin URL demandé, quelle que soit votre RewriteRuledirective. Cela contient également une chaîne de requête potentielle (que, à proprement parler, vous devriez probablement diviser dans votre code PHP). (Contrairement à la variable de serveur Apache du même nom qui ne contient que le chemin de l'URL.)
Si à la place vous avez choisi de passer une chaîne de requête, comme dans votre "changé" RewriteRule, alors vous ne semblez pas avoir besoin d'ajouter le préfixe barre oblique (puisque vous supprimez cela dans votre code PHP). Par example:
RewriteRule (.*) index.php?$1 [QSA,L]
Ensuite, index.phpvous auriez:
$url = !empty($_SERVER['QUERY_STRING']) ? explode('/',$_SERVER['QUERY_STRING']) : [];
Notez qu'il $_SERVER['QUERY_STRING']est toujours défini, d'où la nécessité de vérifier !empty(), plutôt que isset().