RewriteRule pour la gestion des pages donnant le nom de la page cible au lieu de la requête

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