Le modèle vhost Nginx regex se termine en tant que nom de serveur PHP

12

J'ai une définition de serveur nginx avec une correspondance regex, comme ceci:

server_name ~^(?<vhost>[a-z0-9-]+)\.example\.com$;
root /var/www/example/$vhost;
access_log /var/log/nginx/$vhost.example-access.log;

Cela fonctionne bien, cependant, ce domaine héberge divers projets PHP utilisant fastcgi et PHP-FPM, qui reçoivent des valeurs comme celle-ci dans $_SERVER:

SERVER_NAME => "~^(?<vhost>[a-z0-9-]+)\.example\.com$"
HTTP_HOST   => "myhost.example.com"

Comme vous pouvez le voir, le modèle d'expression régulière est placé dans SERVER_NAMEplutôt que la chaîne qui lui correspond. Cela me semble un peu bogué et représente également un risque pour la sécurité car il révèle des détails inutiles (dans d'autres configurations, je fais correspondre un ensemble de noms spécifique plutôt qu'un caractère générique).

Vous pourriez dire "utilisez HTTP_HOST au lieu de SERVER_NAME" - si seulement c'était aussi simple - il existe des bibliothèques qui s'attendent à ce que SERVER_NAME contienne (sans surprise) le nom du serveur. Je ne peux pas vraiment voir un bon cas d'utilisation pour ce comportement.

Synchro
la source

Réponses:

14

Grâce à l'effet canard en caoutchouc de l'écriture de cette question, j'ai trouvé une solution.

Le fastcgi_paramsfichier de stock de Nginx contient la ligne:

fastcgi_param  SERVER_NAME        $server_name;

ce qui fait apparaître cette valeur $_SERVER['SERVER_NAME']dans l'environnement PHP.

J'ai changé cela pour utiliser la variable $ host :

fastcgi_param  SERVER_NAME        $host;

et mon problème a disparu. J'aimerais savoir s'il y a des inconvénients à cette approche.

Synchro
la source
Le seul inconvénient de cette approche est qu'elle repose sur la variable $ host, ce qui signifie qu'elle peut être remplacée par l'utilisateur s'il envoie l'en-tête HTTP_HOST. Vous pouvez tester cela en utilisant curl: curl --header "HOST: google.com" http://yourdomain/yourpage.phpet dans yourpage.php put: <?php echo $_SERVER['SERVER_NAME']; ?>Vous verrez google.com
Ghulam Ali
2
server_name  ~^(?<subdomain>.+)\.example\.com$;
set $server_name_full $subdomain.example.com;


location ~ \.php$ {
    ...
    include fastcgi_params;
    fastcgi_param SERVER_NAME $server_name_full;
    ...
}
Filippok
la source
3
Bien que le code soit apprécié, il doit toujours être accompagné d'une explication. Cela ne doit pas être long, mais c'est prévu.
peterh