Dado que soy un principiante en la proxy de nginx, tengo una pregunta.
La idea principal es:
¿Dónde establece nginx los valores predeterminados para $_SERVER["HTTP_X_FORWARDED_HOST"],
$_SERVER["HTTP_X_FORWARDED_SERVER"] y
$_SERVER["HTTP_X_FORWARDED_FOR"]?
Más información:
Este es un entorno de desarrollo.
Tengo una entrada de vhost en mi proxy de nginx:
server {
listen 192.168.1.17:443 ssl;
server_name foo.bar.com;
ssl_certificate /etc/nginx/ssl/boerse.de.crt;
ssl_certificate_key /etc/nginx/ssl/boerse.de.key;
location / {
proxy_pass http://foo_cluster/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
foo_cluster solo reenvía a un servidor:
upstream foo_cluster {
ip_hash;
server 192.168.5.33:80 fail_timeout=30s;
server 192.168.5.34:80 fail_timeout=30s down;
}
En mi servidor web de Apache en 192.168.5.33 tengo otro vhost:
ServerName foo.bar.com
ServerAdmin webmaster@bar.com
DocumentRoot /var/www/foo-bar-com
Options Indexes FollowSymLinks MultiViews
AllowOverride ALL
Order allow,deny
allow from all
LogLevel warn
ErrorLog /var/log/apache2/foo.bar.com_error.log
CustomLog /var/log/apache2/foo.bar.com_access.log combined
ServerSignature On
SetEnv ApplicationConfigFiles "/var/ApplicationConfigFiles/"
php_value include_path ".:/var/www/baz/global/php/base:/var/www/foo-bar-com/vendor/library/:/var/www/foo-bar-com/vendor/models/model/:"
php_value auto_prepend_file /var/www/foo-bar-com/class/functions/prepend.php
php_value auto_append_file /var/www/foo-bar-com/class/functions/append.php
En mi archivo de hosts en mi máquina local he agregado el servidor:
...
192.168.1.17 foo.bar.com
...
En mi prepend.php solo muestro el superglobal $_SERVER y luego lo detengo:
`
Bien. Ahora, con todo eso configurado, abro el sitio web en mi navegador en https://foo.bar.com
Aquí tienes un extracto del código fuente de salida:
array(32) {
...
["HTTP_HOST"]=>
string(11) "foo.bar.com"
["HTTP_X_FORWARDED_HOST"]=>
string(11) "foo.bar.com"
["HTTP_X_FORWARDED_SERVER"]=>
string(11) "foo.bar.com"
["HTTP_X_FORWARDED_FOR"]=>
string(13) "192.168.2.131"
["HTTP_CONNECTION"]=>
string(5) "close"
...
Como me falta X-Forwarded-Proto esperado, comento todas las proxy_set_header en el archivo vhost de nginx (y vuelvo a cargar el servicio):
server {
listen 192.168.1.17:443 ssl;
server_name foo.bar.com;
ssl_certificate /etc/nginx/ssl/boerse.de.crt;
ssl_certificate_key /etc/nginx/ssl/boerse.de.key;
location / {
proxy_pass http://foo_cluster/;
#proxy_set_header Host $host;
#proxy_set_header X-Forwarded-Host $host;
#proxy_set_header X-Forwarded-Server $host;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#proxy_set_header X-Forwarded-Proto $scheme;
}
}
Aún así, la salida del resultado sigue siendo la misma.
He buscado en Google por qué esto podría ser el caso todo el día.
La documentación de nginx para proxy_set_header dice:
Esta directiva permite redefinir y agregar algunas líneas de encabezado de solicitud que se transferirán al servidor proxy.
Me pregunto por qué dice exactamente "redefinir". No he encontrado respuesta alguna sobre qué está predefinido aquí para ser redefinido a través de proxy_set_header.
He buscado proxy_set_header en /etc/nginx/nginx.conf, de hecho, recorrí todo el directorio /etc/nginx con
grep -ri x-forwarded-host *
Solo se encontraron resultados en sites-available y sites-enabled.
Busqué lo mismo en el servidor web de Apache sin resultados útiles (pensé que podrían estar configurados en código php pero estaba equivocado).
Dudo si mi archivo vhost de nginx es incluso el que se está utilizando.
Gracias por tu tiempo.
Tldr:
¿Dónde establece un proxy de nginx los valores predeterminados para $_SERVER["HTTP_X_FORWARDED_HOST"],
$_SERVER["HTTP_X_FORWARDED_SERVER"] y
$_SERVER["HTTP_X_FORWARDED_FOR"]?
`