====== Nginx - bloc server, location et redirections ======
Voir aussi : [[https://www.nginx.com/resources/wiki/start/topics/examples/server_blocks/]]
===== 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 : [[https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/|If Is Evil]]