O padrão Nginx regex vhost acaba como o nome do servidor PHP

12

Eu tenho uma definição de servidor nginx com uma correspondência de regex, assim:

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

No entanto, como tudo funciona bem, esse domínio hospeda vários projetos PHP usando fastcgi e PHP-FPM, que recebem valores como este em $_SERVER:

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

Como você pode ver, o padrão regex é colocado em SERVER_NAMEvez da string em que ele corresponde. Isso me parece um pouco problemático e também representa um risco de segurança, pois revela detalhes desnecessários (em outras configurações, estou combinando um conjunto específico de nomes em vez de um curinga).

Você pode dizer "use HTTP_HOST em vez de SERVER_NAME" - se fosse assim tão simples - existem bibliotecas que esperam que SERVER_NAME (sem surpresa) contenha o nome do servidor. Não vejo realmente um bom caso de uso para esse comportamento.

Synchro
fonte

Respostas:

14

Graças ao efeito pato de borracha de escrever esta pergunta, encontrei uma solução.

O fastcgi_paramsarquivo de ações do Nginx contém a linha:

fastcgi_param  SERVER_NAME        $server_name;

que é o que faz com que esse valor apareça no $_SERVER['SERVER_NAME']ambiente PHP.

Mudei isso para usar a variável $ host :

fastcgi_param  SERVER_NAME        $host;

e meu problema foi embora. Eu estaria interessado em saber se há alguma desvantagem nessa abordagem.

Synchro
fonte
A única desvantagem dessa abordagem é que ela depende da variável $ host, o que significa que ela pode ser substituída pelo usuário se ele enviar o cabeçalho HTTP_HOST. Você pode testar isso usando curl: curl --header "HOST: google.com" http://yourdomain/yourpage.phpe em yourpage.php coloque: <?php echo $_SERVER['SERVER_NAME']; ?>Você verá 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
fonte
3
Embora o código seja apreciado, ele deve sempre ter uma explicação que o acompanha. Isso não precisa ser longo, mas é esperado.
peterh - Restabelece Monica