Dans le fichier de configuration Apache, certaines règles sont définies comme ci-dessous:
<IfModule mod_rewrite.c>
RewriteRule ^(Category)/([^/]+)/(.+)$ index.php?module=$1&id=$2&action=$3 [B,L,QSA]
RewriteRule ^(Listing)/(.+)$ index.php?module=$1&id=$2 [B,L,QSA]
RewriteRule ^([^/]+)/(.+)$ index.php?module=$1&action=$2 [B,L,QSA]
...
</IfModule>
Toute cette adresse http://web/foo/bar
est en interne traduite (pas de redirections) en http://web/index.php?module=foo&id=bar
: foo
, bar
sont envoyés à index.php en tant que paramètres.
Maintenant, je veux ajouter une règle qui traduit http://web/api?key1=val1&key2=val2
en http://web/api/index.php?key1=val1&key2=val2
de manière similaire.
J'ai essayé de placer RewriteRule ^(api)//?(.+)$ api/index.php?$2 [B,L,QSA]
en haut de toutes les règles, de redémarrer Apache mais http://web/api?foo=bar
devient http://web/api/?foo=bar
(avec extra /
après api
) dans la barre d'adresse du navigateur et de l'appel. est redirigé vers http://web/index.php
(car une erreur est générée du fichier).
Comment changer le RewriteRule pour rendre http://web/api/index.php
lorsque la demande est faite http://web/api?..
?
Le problème est que vous avez un répertoire api
. Le code Apache qui gère les redirections pour ajouter des barres obliques au répertoire est présent avant la règle de réécriture. Déplacez votre répertoire api vers quelque chose d'autre (comme apiscripts
), puis utilisez la règle de réécriture:
RewriteRule ^api$ apiscripts/index.php [L,QSA]
Vous avez besoin des drapeaux sur la règle de réécriture:
L
(dernier) - pour que les autres règles ne soient pas déclenchéesQSA
(chaîne de requête append) - afin que mod_rewrite transmette les paramètres viaJe vous recommanderais également d'ajouter certaines conditions à votre dernière règle de réécriture pour vous assurer qu'elle n'est déclenchée pour aucun chemin représentant réellement des répertoires, des fichiers ou des liens:
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^([^/]+)/(.+)$ index.php?module=$1&action=$2 [B,L,QSA]