Das Nginx-Regex-Vhost-Muster endet als PHP-Servername

12

Ich habe eine Nginx-Serverdefinition mit einer Regex-Übereinstimmung wie folgt:

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

Das alles funktioniert gut, aber diese Domain hostet verschiedene PHP-Projekte mit Fastcgi und PHP-FPM, die folgende Werte erhalten $_SERVER:

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

Wie Sie sehen können, wird das Regex-Muster SERVER_NAMEanstelle der übereinstimmenden Zeichenfolge eingefügt. Das scheint mir ein bisschen fehlerhaft zu sein und stellt auch ein Sicherheitsrisiko dar, da es unnötige Details enthüllt (in anderen Konfigurationen stimme ich eher mit einem bestimmten Satz von Namen als mit einem Platzhalter überein).

Sie könnten sagen "Verwenden Sie HTTP_HOST anstelle von SERVER_NAME" - wenn es nur so einfach wäre - es gibt Bibliotheken, die erwarten, dass SERVER_NAME (keine Überraschung) den Namen des Servers enthält. Ich kann keinen guten Anwendungsfall für dieses Verhalten sehen.

Synchro
quelle

Antworten:

14

Dank des Gummiente-Effekts beim Schreiben dieser Frage habe ich eine Lösung gefunden.

Die Aktiendatei von Nginx fastcgi_paramsenthält die folgende Zeile:

fastcgi_param  SERVER_NAME        $server_name;

Dies führt dazu, dass dieser Wert $_SERVER['SERVER_NAME']in der PHP-Umgebung angezeigt wird.

Ich habe das geändert, um die Variable $ host zu verwenden :

fastcgi_param  SERVER_NAME        $host;

und mein Problem ging weg. Es würde mich interessieren, ob dieser Ansatz Nachteile hat.

Synchro
quelle
Der einzige Nachteil dieses Ansatzes besteht darin, dass er sich auf die Variable $ host stützt. Dies bedeutet, dass sie vom Benutzer überschrieben werden kann, wenn er den HTTP_HOST-Header sendet. Sie können dies mit curl testen: curl --header "HOST: google.com" http://yourdomain/yourpage.phpund in yourpage.php setzen: <?php echo $_SERVER['SERVER_NAME']; ?>Sie werden 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
quelle
3
Obwohl der Code geschätzt wird, sollte er immer eine begleitende Erklärung enthalten. Das muss nicht lange dauern, wird aber erwartet.
Peter