J’ai ce code:
RewriteEngine on RewriteRule api/v2/([^/]+)/?$ api/v2/api.php?request=$1 [L] RewriteRule api/v2 api/v2/api.php [L] RewriteRule ^$ handler.php?request=main [L] RewriteRule ^(.*)$ handler.php?request=$1 [L]
… dans mon fichier .htaccess dans le répertoire racine. Son intention est de réécrire https://example.org/hello/world
avec https://example.org/handler.php?request=hello/world
.
Chaque fois que je navigue vers un répertoire existant, il ajoute ?request
à la fin. Par exemple: si je navigue sur https://example.org/foo
(foo étant un répertoire), il sera redirigé vers https://example.org/foo/?request=foo
.
Pourquoi cela se produit-il et comment puis-je le réparer?
Mise à jour 1
J’ai ajouté les lignes suivantes, qui fonctionnent comme il faut:
RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_URI} !(/$|\.) RewriteRule (.*) %{REQUEST_URI}/ [R=301,L]
Mais cela a causé un autre problème, quand je vais à handler.php et echo $_GET["request"]
, je reçois handler.php
.
Mise à jour 2
J’ai raccourci le .htaccess
pour ceci:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_URI} !(/$|\.) RewriteRule (.*) %{REQUEST_URI}/ [R=301,L] RewriteRule ^(.*)$ handler.php?request=$1 [L]
Mais toujours le même problème, $_GET["request"]
renvoie handler.php
Mise à jour 3
J’ai ajouté une prime à cette question, plus par curiosité qu’autre chose.
Le problème est que votre règle réécrit la demande en mode boucle en réécrivant le fichier de destination handler.php sur lui-même en raison de la règle inconditionnelle et du modèle fourre-tout.
Vous devez corriger le modèle de votre règle pour qu’il ne corresponde pas au fichier de destination.
rewrite engine on RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_URI} !(/$|\.) RewriteRule (.*) %{REQUEST_URI}/ [R=301,L] RewriteRule ^((?!handler.php).*)$ handler.php?request=$1 [L]
Je l’utiliserais dans l’approche opposée. Si le fichier demandé n’est pas un fichier ou un répertoire existant, définissez une rewriterule sur le fichier du gestionnaire avec la demande.
Testé le code suivant et il semble fonctionner.
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ handler.php?request=$1 [L]
handler.php
var_dump($_GET);
http: // localhost / hello / world
Sortie:
array(1) { ["request"]=> ssortingng(11) "hello/world" }
http: // localhost / example (existe)
Sortie:
Directory parent
http: //localhost/a.php (existe)
Sortie:
File a exists //Something that is written in a.php