web-dev-qa-db-fra.com

Ignorer toutes les règles et rediriger en interne vers un autre dossier / fichier

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?..?

1
Annie

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ées
  • QSA (chaîne de requête append) - afin que mod_rewrite transmette les paramètres via

Je 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]
1
Stephen Ostermiller