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.

Poster un nouveau commentaire

Le contenu de ce champ ne sera pas montré publiquement. If you have a Gravatar account associated with the e-mail address you provide, it will be used to display your avatar.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.
  • You can enable syntax highlighting of source code with the following tags: <code>, <php>.

Plus d'informations sur les options de formatage

CAPTCHA
La vérification ne tient pas compte des minuscules ou des majuscules.
Image CAPTCHA
Enter the characters shown in the image.