Réécriture d'URI avec Nginx

Le logo Nginx

Quand on utilise le Zend Framework et son architecture MVC pour construire un site, on doit configurer son serveur Web pour rediriger toutes les requêtes qui ne correspondent pas à un document réellement présent sur le serveur vers le script index.php.

Si on utilise Nginx, on doit donc utiliser la règle de réécriture suivante :

if (!-e $request_filename){
  rewrite ^.*$ /index.php break;
}

La directive -e teste l'existence d'un fichier standard, d'un répertoire ou d'un lien symbolique. Si le fichier n'existe pas, on réécrit les URI qui correspondent à l'expression régulière fournie. Dans notre cas , l'expression régulière ^.*$ correspond à toute les URL possibles. Le drapeau break termine le processus de traitement pour cette requête.

Sur mon serveur, j'ai été amené à déplacer certains fichiers dans un répertoire différent de celui qui contient mes scripts PHP pour une question de déploiement.

Il me fallait donc ne pas réécrire certaines URI et changer le répertoire de base (root) pour certaines requêtes.

La solution consiste à placer une règle de réécriture avant la règle utilisée par le ZF:

rewrite ^(/chemin/.*)$ $1 last;
 
if (!-e $request_filename){
  rewrite ^.*$ /index.php break;
}

Cette règle réécrit à l'identique les URI commencant par /chemin/. Le drapeau last permet de stopper le processus de réécriture pour cette requête tout en laissant Nginx appliquer les directives location. On évite ainsi les autres règles de réécriture qui suivent.

J'ai ensuite ajouté une directive location qui définit une racine différente pour les requêtes commençant par /chemin/ :

location ^~ /chemin/ {
  root /mon/autre/racine;
}

Ce qu'il faut bien prendre en compte, c'est que les règles de réécritures sont appliquées avant que Nginx ne traite les directives location.

Ajouter un commentaire