Blog geekesque... ou presque

Aller au contenu | Aller au menu | Aller à la recherche

lundi 23 octobre 2017

Nginx: répertoire par sous-domaine

Cette petite astuce permet de simplifier la gestion des sous-domaines sur nginx, et surtout ne pas avoir à modifier sa configuration à chaque fois que l'on crée ou supprime un sous-domaine.

Elle exploite la possibilité de nginx d'utiliser des expressions rationnelles dans le nom du serveur.

Configuration

[nginx]
server {
        listen 80;
        server_name ~^(?<subdomain>([^\.]+))\.domaine\.com$;
        if (!-d /home/domain/public_html/$subdomain) {
                rewrite . http://domain.com redirect;
        }
        root /home/domain/public_html/$subdomain;
        index index.php index.html;
        location / {
                try_files $uri $uri/ /index.php?$args;
        }
        access_log /var/log/nginx/domain.dynam.access.log;
        error_log /var/log/nginx/domain.dynam.error.log;
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_index index.php;
                include fastcgi.conf;
        }
        location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|txt|xml)$ {
                access_log off;
                expires 30d;
        }
}

Explications

URL appelée

[nginx]
server_name ~^(?<subdomain>([^\.]+))\.domaine\.com$;

Cette directive permet de capturer dans la variable $subdomain tout ce qui précède .domaine.com dans l'url appelée. Notez qu'elle ne prend pas en compte l'appel http://domaine.com qui sera notre adresse par défaut et doit donc être traitée par un autre bloc de configuration.

Redirection par défaut

[nginx]
if (!-d /home/domain/public_html/$subdomain) {
   rewrite . http://domain.com redirect;
}

Cette directive est connue des habitués des scripts shell: s'il n'existe pas de sous-répertoire correspondant au sous-domaine, on redirige (de manière visible) l'utilisateur sur l'url par défaut.

Définition du répertoire source

[nginx]
root /home/domain/public_html/$subdomain;

On définit de manière dynamique le répertoire source, toutes les directives suivantes l'utiliseront.

mercredi 4 janvier 2017

Bloquer des pays sur Nginx

Depuis un certains temps, mes différents sites se font spammer par des robots provenant en particulier de 3 pays, à savoir la Chine, l’Afghanistan et l'Iran.

Utilisant un compte Cloudflare gratuit, je n'ai pas la possibilité de les bloquer via l'interface, je suis donc obligé de faire cela via la configuration de nginx. J'en ai donc profité pour faire un petit script qui automatise la liste des IP à bannir pour gérer ça d'une manière plus simple.

Lire la suite...