El patrón vgin Ngex regex termina como el nombre del servidor PHP

12

Tengo una definición de servidor nginx con una coincidencia de expresiones regulares, como esta:

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

Sin embargo, todo funciona bien, este dominio aloja varios proyectos PHP que usan fastcgi y PHP-FPM, que reciben valores como este en $_SERVER:

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

Como puede ver, el patrón regex se coloca en SERVER_NAMElugar de la cadena que coincide. Eso me parece un poco defectuoso, y también representa un riesgo de seguridad ya que revela detalles innecesarios (en otras configuraciones, coincido con un conjunto específico de nombres en lugar de un comodín).

Puede decir "use HTTP_HOST en lugar de SERVER_NAME", aunque fuera así de simple, hay bibliotecas que esperan que SERVER_NAME contenga (no es de extrañar) el nombre del servidor. Realmente no puedo ver un buen caso de uso para este comportamiento.

Synchro
fuente

Respuestas:

14

Gracias al efecto pato de goma de escribir esta pregunta, encontré una solución.

El fastcgi_paramsarchivo de stock de Nginx contiene la línea:

fastcgi_param  SERVER_NAME        $server_name;

que es lo que hace que ese valor aparezca $_SERVER['SERVER_NAME']en el entorno PHP.

Cambié eso para usar la variable $ host :

fastcgi_param  SERVER_NAME        $host;

y mi problema desapareció Me interesaría saber si hay algún inconveniente de este enfoque.

Synchro
fuente
El único inconveniente de este enfoque es que depende de la variable $ host, lo que significa que el usuario puede sobrescribirlo si envía el encabezado HTTP_HOST. Puede probar esto usando curl: curl --header "HOST: google.com" http://yourdomain/yourpage.phpy en yourpage.php poner: <?php echo $_SERVER['SERVER_NAME']; ?>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
fuente
3
Aunque se aprecia el código, siempre debe tener una explicación que lo acompañe. Esto no tiene que ser largo, pero se espera.
peterh - Restablece a Monica el