Il modello vge regex di Nginx finisce come nome del server PHP


12

Ho una definizione del server nginx con una corrispondenza regex, in questo modo:

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

Che tutto funzioni bene, tuttavia, questo dominio ospita vari progetti PHP usando fastcgi e PHP-FPM, che ricevono valori come questo in $_SERVER:

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

Come puoi vedere, il pattern regex viene inserito SERVER_NAMEpiuttosto che nella stringa corrispondente. Mi sembra un po 'difettoso e rappresenta anche un rischio per la sicurezza in quanto sta rivelando dettagli non necessari (in altre configurazioni sto abbinando un insieme specifico di nomi piuttosto che un carattere jolly).

Potresti dire "usa HTTP_HOST invece di SERVER_NAME" - se solo fosse così semplice - ci sono librerie che si aspettano che SERVER_NAME contenga (senza sorpresa) il nome del server. Non riesco davvero a vedere un buon caso d'uso per questo comportamento.

Risposte:


14

Grazie all'effetto paperella di gomma di scrivere questa domanda, ho trovato una soluzione.

Il fastcgi_paramsfile di stock di Nginx contiene la riga:

fastcgi_param  SERVER_NAME        $server_name;

che è ciò che fa apparire quel valore $_SERVER['SERVER_NAME']nell'ambiente PHP.

L'ho cambiato per usare la variabile $ host :

fastcgi_param  SERVER_NAME        $host;

e il mio problema è andato via. Sarei interessato a sapere se ci sono aspetti negativi di questo approccio.


L'unico aspetto negativo di questo approccio è che si basa sulla variabile $ host, il che significa che può essere sovrascritto dall'utente se invia un'intestazione HTTP_HOST. Puoi testarlo usando curl: curl --header "HOST: google.com" http://yourdomain/yourpage.phpe nel tuo page.php metti: <?php echo $_SERVER['SERVER_NAME']; ?>Vedrai 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;
    ...
}

3
Sebbene il codice sia apprezzato, dovrebbe sempre avere una spiegazione di accompagnamento. Questo non deve essere lungo, ma è previsto.
Peter - Ripristina Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.