Nginx : comment réécrire des URL avec rewrite

Le serveur WEB Nginx donne la possibilité de réécrire très facilement des URL.
Pour cela, on utilise les directives rewrite ou return.
Les deux permettent de créer des redirections 301, 302 mais la directive rewrite est bien plus puissante.
En effet, on peut utiliser les expressions régulières pour créer des réécritures d'URL complexes.

Dans ce tutoriel, je vous montre comment fonctionne la réécriture d'URL sur Nginx.

Nginx : comment réécrire des URL avec rewrite

Comment utiliser rewrite sur Nginx

La directive rewrite donne la possibilité d'une réécriture complète d'une ou un groupe d'URL en utilisant les expressions régulières.
Cela est utile lorsque l'on doit manipuler des arguments d'URL par exemple.
Voici la syntaxe :

rewrite regex URL [flag];
  • Regex : est l'expression régulière pour correspondre à une ou un groupe d'URL
  • URL : L'URL finale réécrite
  • Flag : les drapeaux break, last, redirect ou permanent. Voir le paragraphe suivant

Les variables et drapeaux

return et rewrite acceptent plusieurs variables dont voici les principales :

  • $host est le nom d'hôte
  • $scheme est utilisé pour définir le schéma de l'URL (HTTP ou HTTPS)
  • $request_uri contient une URI complète avec des paramètres

Les drapeaux de rewrite :

  • Last : arrête le traitement de l'ensemble actuel de directives rewrite et démarre une recherche d'un nouveau bloc location correspondant à l'URI modifiée
  • break : arrête le traitement de l'ensemble actuel de la directive rewrite et aucune recherche de bloc location avec la nouvelle URL est effectuée
  • redirect renvoie une redirection temporaire avec le code 302; utilisé si une chaîne de remplacement ne commence pas par "http: //", "https: //" ou "$scheme"
  • permanent : Renvoie une redirection permanente avec le code 301

Comment réécrire des URL avec rewrites avec Nginx

Utilisez return pour retourner un code spécifique ou effectuer une redirection sur une URL.
Tandis qu'il vaut mieux utiliser rewrite pour effectuer des redirections sur des groupes d'URL ou manipuler des arguments d'URI.

Réécrire une page statique avec rewrite

Voici un exemple de réécriture d'URL statique avec rewrite :

server {
          [...
]
          location = /tutoriel-malekal 
          { 
            rewrite ^/tutoriel-malekal$ /malekal-tuto.html break; 
          }
          [...]

}
  • Le bloc location correspond à l'URL avec /tutoriel-malekal
  • Puis rewrite cherche le motif ^/tutoriel-malekal?$
    • Le caractère ^ indique que la page doit commencer par le mot tutoriel
    • Le caractère $ correspond à la fin de l'URL
  • /malekal-tuto.html est la nouvelle URL réécrite
  • break indique d'arrêter la réécriture ici et aucune recherche de bloc location n'est effectuée avec la nouvelle URL

Réécrire des pages dynamiques

On peut aussi réécrire des pages dynamiques qui contiennent des arguments.
Cela est utile, par exemple en PHP.

Imaginons la page https://www.example.com/user.php?id=11 que vous désirez réécrire en https://www.example.com/user/11.
On peut faire cela en seule règle rewrite de cette manière :

server {
          [...]

          location = /user.php 
          { 
            rewrite user.php?id=$1 ^user/([0-9]+)/?$ break; 
          }
          [...]

}
  • La directive location /user.php indique de n'appliquer le bloc que pour les pages /user.php
  • Puis la directive rewrite s'applique sur les pages user.php?id=$1
    • L'expression régulière dans le support carré [0-9] + contient une plage de caractères compris entre 0 et 9. Le signe + signifie correspondant à un ou plusieurs des caractères précédents. Sans le signe + +, l'expression régulière ci-dessus correspondra à seulement 1 caractère comme 5 ou 8 mais pas avec 25 ou 44
    • La parenthèse () dans l'expression régulière fait référence à la référence arrière. Le $1 de l'URL de remplacement user.php?id=$1 fait référence à cette référence arrière

Ainsi, si un utilisateur se connecte avec l'URL https://www.example.com/user.php?id=20, il sera redirigé vers https://www.example.com/user/20 grâce à la réécriture de l'URL.

Comment retourner du texte ou JSON

On peut aussi return pour retourner du texte ou du contenu en JSON
Par exemple pour retourner des données au format texte :

location ~ ^/get_text {
  default_type text/html;
  return 200 'This is test text!'; 
}

Retourner des données en JSON :

location ~ ^/get_json {
  default_type application/json;
  return 200 '{"status":"success","result":"nginx test json"}';
}

Créer des redirections de pages, URL, domaine

Enfin rewrites vous permet aussi de créer des redirections de pages, URL ou domaine.
Le tutoriel suivant vous explique comment faire avec de multiples exemples

Tags: