Wzorzec vgin Ngex regex kończy się nazwą serwera PHP

12

Mam definicję serwera nginx z dopasowaniem wyrażenia regularnego, jak poniżej:

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

To wszystko działa dobrze, jednak ta domena obsługuje różne projekty PHP wykorzystujące fastcgi i PHP-FPM, które otrzymują takie wartości w $_SERVER:

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

Jak widać, wzór wyrażenia regularnego jest wstawiany SERVER_NAMEzamiast pasującego łańcucha. Wydaje mi się to trochę błędne, a także stanowi zagrożenie dla bezpieczeństwa, ponieważ ujawnia niepotrzebne szczegóły (w innych konfiguracjach dopasowuję konkretny zestaw nazw zamiast znaku wieloznacznego).

Możesz powiedzieć „użyj HTTP_HOST zamiast SERVER_NAME” - gdyby tylko było to takie proste - istnieją biblioteki, które oczekują, że SERVER_NAME (bez zaskoczenia) będzie zawierał nazwę serwera. Naprawdę nie widzę dobrego przypadku użycia dla tego zachowania.

Synchro
źródło

Odpowiedzi:

14

Dzięki efektowi gumowej kaczki pisząc to pytanie, znalazłem rozwiązanie.

fastcgi_paramsPlik akcji Nginx zawiera wiersz:

fastcgi_param  SERVER_NAME        $server_name;

co powoduje, że ta wartość pojawia się w $_SERVER['SERVER_NAME']środowisku PHP.

Zmieniłem to, aby użyć zmiennej $ host :

fastcgi_param  SERVER_NAME        $host;

i mój problem zniknął. Chciałbym wiedzieć, czy takie podejście ma wady.

Synchro
źródło
Jedynym minusem tego podejścia jest to, że polega ono na zmiennej $ host, co oznacza, że ​​może zostać zastąpione przez użytkownika, jeśli wyśle ​​nagłówek HTTP_HOST. Możesz to przetestować za pomocą curl: curl --header "HOST: google.com" http://yourdomain/yourpage.phporaz w zakładce yourpage.php: <?php echo $_SERVER['SERVER_NAME']; ?>Zobaczysz 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
źródło
3
Mimo że kod jest doceniany, zawsze powinien zawierać towarzyszące mu wyjaśnienie. To nie musi być długo, ale należy się tego spodziewać.
Peter - Przywróć Monikę