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".