Aujourd’hui un des serveurs HTTP le plus utilisé est Nginx, qui a été conçu pour répondre au problème C10K où le but est d’être capable de répondre à plus de 10 000 requêtes simultanées. Nginx est donc le server http le plus performant lors d’une montée en charge important avec un système de worker. Là ou apache crée un processus par connexion, Nginx lance une série de workers qui vont chacun être capable de gérer de multiples connexions d’une manière non bloquante. Rue de l’info vous explique ci-dessous en détails, la méthode pour effectuer une redirection Nginx.
Redirection Nginx simple : (d’une page à une autre)
1 2 3 4 5 6 7 |
server { listen 80; server_name www.domaine.com; rewrite ^/page.html$ http://www.domaine.com/autre-page.html permanent; } |
Le mot clé “permanent” signifie que la redirection sera de type 301, alors que “redirect” signifie qu’elle sera de type 302 donc temporaire.
Redirection d’un groupe d’URL
1 2 3 |
rewrite ^/liste/article-.*.html$ http://www.domaine.com/blog/article-$1.html permanent; |
Dans cette exemple j’utilise les expressions régulières, redirige un groupe d’URL avec une syntaxe commune.
Redirection d’une URL avec paramètres vers une URL sans paramètre
1 2 3 4 5 6 7 |
location ~ /demo.html { if ($args ~ limit=50){ rewrite ^ http://www.domaine.com/articles.html? permanent; } } |
Dans ce cas, j’ai une URL avec un paramètre limite égale à 50, ce paramètre ne set plus je voudrais donc m’en débarrasser.
Le point d’interrogation à la fin de l’URL rewrite permet de dire à Nginx de ne pas ajouter les paramètres derrière l’URL.
La variable “args” définit les paramètres. Location permet de définir le pattern d’URL concernés par le rewrite. Le ~ introduit une expression régulière (sensible à la casse).
.
Redirection d’une URL si un paramètre existe
1 2 3 4 5 6 7 |
location ~ /demo.html { if ($arg_article != "") { rewrite ^ http://www.domaine.com/articles.html? permanent; } } |
Ici je redirige les URL finissants par /demo.html ayant au moins un paramètre, peu importe la valeur, vers une URL sans paramètre
1 2 3 4 5 6 7 |
location ~ /demo.html { if ($arg_article != ""){ rewrite ^ http://www.domaine.com/article/$arg_article? permanent; } } |
Ici je fais la même chose en récupérant le paramètre article et en le plaçant comme Slug dans la nouvelle URL
Redirection vers le sous-domaine www
1 2 3 4 5 6 7 |
server { listen 80; server_name domaine.com; rewrite ^/(.*) http://www.domaine.com/$1 permanent; } |
Ici je redirige toutes les URL de domaine.com vers www.domaine.com
Redirection ou code serveur spécifique en fonction du user-agent
1 2 3 4 5 6 7 8 |
location ~ (wp-admin|wp-login.php) { if ($http_user_agent ~* "(bingbot|googlebot)") { return 403; break; } } |
Dans ce cas j’ai besoin de bloquer le Crawl de Google et Bing pour certaines pages. Pour cela on vérifie le user agent qui se présente. J’envoie donc un forbidden sur une page que Googlebot ou Bingbot. L’utilisation de “break” indique que le serveur ne doit appliquer les directives qu’à l’intérieur du bloc défini par “location”. A l’inverse avec “last”, le serveur recherche une URL qui pourrait matcher avec le pattern dans tous les blocs “location”.
Redirection en fonction d’un code serveur
1 2 3 |
error_page 500 502 503 504 /50x.html; |
Vérification et redémarrage
Une fois toutes vos modifications effectuées il ne faut pas oublier de recharger la configuration en redémarrant Nginx.
1 2 3 4 5 6 |
# Pour tester la configuration sudo nginx -t # Pour recharger la configuration sudo service nginx restart |