Ziirish's Home :: Blog

Ziirish's Pub

 
 

Je vous ai déjà vanté les mérites de nginx plusieurs fois. Vous savez donc que j'ai un petit faible pour ce dernier par rapport au mastodonte qu'est Apache. Seulement voilà, sur Apache y'avait un truc vachement convi : les alias.

On peut par exemple définir un alias de la sorte :


<VirtualHost *:80>
    ServerName blah.toto.com

    DocumentRoot /var/www
    
    <Directory /var/www>
        AllowOverride None 
        Order allow,deny 
        allow from all
    </Directory>

    Alias /poney /home/poney/htdocs
    <Directory /home/poney/htdocs>
        AllowOverride None 
        Order allow,deny 
        allow from all
    </Directory>
</VirtualHost>

On peut donc accéder à un "site virtuel" via l'URL :

http://blah.toto.com/poney

Sur nginx, c'est pareil... si l'on sert des fichiers statiques ! Mais si on sert des scripts (php, par exemple), notre règle proxy_pass prédomine.

Mais j'ai trouvé un contournement que voici :


server {
    listen   80 default;
    server_name  toto.com;

    location / { 
        root   /var/www;
        index  index.html index.htm index.php index.pl;
    }   

    location /poney {
        proxy_pass http://poney.com;
        ### Set headers ####
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_redirect  default;
    }

    location ~* ^/?[^/]+.php$ {
        root /var/www;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:1337;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name;
    }   
}

Ainsi, je peux accéder à :

http://toto.com/blah.php, ainsi qu'à http://toto.com/poney/horse.php et ce, sans que nginx tente de passer horse.php à notre serveur php, ce qui produirait une erreur vu que le fichier n'existe pas !

Et tout ça grâce à une simple expression régulière :


^/?[^/]+\.php$

Qui se traduite littéralement par "Tout ce qui ne comporte pas plus d'un 'slash' et qui se termine par .php".