====== 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]]