Table des matières

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

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 :

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 :

A propos des boucles IF

Voir : If Is Evil