Nginx - bloc server, location et redirections
Exemple de fichier ''nginx.conf''
server {
# Nom du serveur
server_name www.domain.tld *.domain.tld domain.tld domainga56f7d4ee87.onion;
# IPv4
listen 80;
# IPv6
listen [::]:80;
# IPv4 SSL
listen 443 ssl http2;
# IPv6 SSL
listen [::]:443 ssl http2;
## Désactiver l'affichage de trop d'informations
server_tokens off;
# Chemin vers notre certificat
ssl_certificate /etc/letsencrypt/live/www.domain.tld/chain.pem;
ssl_certificate_key /etc/letsencrypt/live/www.domain.tld/privkey.pem;
# Redirection de tout http vers https
return 301 https://$server_name$request_uri;
# Si l'on utilise Let's Encrypt, et que l'on souhaite laisser ouvert sur http le dossier de challenge, on peut utiliser (via https://blog.seboss666.info/2017/08/quelques-astuces-diverses-septieme/ )
location ~ ^/(?!\.well-known) {
return 301 https://$server_name$request_uri;
}
# Redirection de domain.tld vers www.domain.tld
if ($http_host = domain.tld){
return 303 https://www.domain.tld$request_uri;
}
# Dossier racine de notre serveur
root /var/www/www.domain.tld/;
# Dossier des fichiers Let's Encrypt - entre autre
location /.well-known/acme-challenge {
alias /var/www/.well-known/acme-challenge/;
}
# Fichier index de base du site
index index.php index.html index.htm;
# Définition et emplacements des fichiers de log
error_log /var/log/nginx/www.domain.tld.error.log;
access_log /var/log/nginx/www.domain.tld.access.log combined;
# Wordpress
location /wp-admin {
allow 10.1.1.11;
allow 10.0.0.0/24;
deny all;
}
location /xmlrpc.php {
allow 10.1.1.11;
allow 10.0.0.0/24;
deny all;
}
# Aucun log, d'erreur ou d'accès sur des fichiers sans trop d'importance
location = /favicon.ico {
log_not_found off;
access_log off;
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
# Aucun accès aux fichiers cachés
location ~ /\. {
access_log off;
log_not_found off;
deny all;
}
location ~ ~$ {
access_log off;
log_not_found off;
deny all;
}
# Monitoring des pools PHP-FPM
location ~ ^/(status|ping)$ {
access_log off;
allow 127.0.0.1;
allow 10.1.1.11;
deny all;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/lib/php7.0-fpm/tap.sock;
}
# Troll
if ($http_user_agent = MSIE) {
rewrite (.*) https://www.mozilla.org/fr/firefox/new/;
}
# Définir une page d'erreur personnalisée
error_page 404 /404.html;
location = /404.html {
root /var/www/html/errors;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html/errors;
}
# Répertoire de base
location / {
try_files $uri $uri/ /index.php?$args;
}
# @ renvoi à un bloc ''location'' prédéfini
location / {
try_files $uri $uri/ @malocationcustom;
}
location @malocationcustom {
rewrite ^/(.+)$ /index.php?$1 last;
}
# Mise en cache des ressources statiques
location ~* \.(?:jpg|jpeg|jpe|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc|mp3|flac|ogg)$ {
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
}
}
Les différents blocs location
location / {
: Préfixe basique, répond à tout ce qui suit/
comme par exemple/mapage?id=1
,location = /about {
: Match exact, ne répondra qu'à la requête/about
, pas par exemple à/about/contact
,location ~ \.(jpe?g|png|gif)$ {
: Répond à une regex simple, AVEC prise en charge de la casse, répond à/image02.jpg
, mais pas àIMG0003.JPG
,location / ~* \.(jpe?g|png|gif|ico)$ {
: Répond à une regex simple, SANS prix en charge de la casse, répond à/image02.jpg
et donc aussi du coup àIMG0003.JPG
,location ^~ /folder {
: empêche qu'un autre bloc location prenne en charge cette URI, prend en charge les regex.
les directives rewrite & try_files
Soit le fichier de configuration Nginx :
server_name www.domain.tld;
root /var/www/site;
location / {
try_files $uri $uri.html $uri/ /fallback/index.html;
}
location /fallback {
root /var/www/fallback;
}
Si l'on demande au serveur d'accéder à www.domain.tld/mapage
, le serveur tentera dans l'ordre de la directive try_files
d'accéder à la ressource :
- www.domain.tld/
mapage
- www.domain.tld/
mapage.html
- www.domain.tld/
mapage/
- www.domain.tld/
fallback/index.html
.
Maintenant, en testant la directive rewrite
, la configuration devient :
server_name www.domain.tld;
root /var/www/site;
location / {
rewrite ^/page/(.*)$ /$1 last;
try_files $uri $uri.html $uri/ /fallback/index.html;
}
location /fallback {
root /var/www/fallback;
}
On aura donc une ligne du style :
rewrite ^/page/(.*)$ /$1 last;
Rewrite est donc suivi d'un pattern à interpréter : ^/page/(.*)$
, et à modifier en /$1
. En gros, une requête www.domain.tld/page/mapage02
renverrait le client vers www.domain.tld/mapage02
.
Le dernier paramètre (optionnel
), ici last
peut être :
- last : Stop la recherche dans cette directive
rewrite
, et continue en traitant une requête avec la nouvelle URI récupérée, - break : Stop la recherche, et continue avec la valeur de l'URI en cours dans le même bloc
location
, - redirect : renvoie une redirection temporaire, soit un code 302,
- permanent : renvoie une redirection permanente, soit un code 301.
A propos des boucles IF
Voir : If Is Evil