.htaccess issue php $ _SERVER ['PATH_INFO'] est vide [fermé]

Sep 01 2020

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

MrWhite Sep 03 2020 at 17:03

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().