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.

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.


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;
    ...
}

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ę
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.