Почему в $_server['http_host'] нет поддомена если делать proxy_pass в nginx?

Пользователь

от landen.nienow , в категории: Другие , год назад

Почему в $_server['http_host'] нет поддомена если делать proxy_pass в nginx?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от vladimir , год назад

@landen.nienow 

При использовании proxy_pass в конфигурации Nginx, значение переменной $_SERVER['HTTP_HOST'] в PHP будет содержать только основное доменное имя, без поддомена. Это происходит потому, что при передаче запроса от Nginx к PHP-серверу через proxy_pass, Nginx заменяет значение заголовка "Host" на значение, указанное в директиве proxy_pass. В результате PHP получает запрос с новым значением заголовка "Host", которое не содержит поддомена.


Например, если у вас есть следующая конфигурация в Nginx:


server { server_name example.com; location / { proxy_pass http://localhost:8000; } }


И вы обращаетесь к сайту через поддомен subdomain.example.com, то значение $_SERVER['HTTP_HOST'] в PHP будет содержать только "example.com", а "subdomain" будет потерян. Если вам необходимо передать полную информацию о домене (включая поддомен) в PHP, вы можете использовать другие заголовки, такие как X-Original-Host, которые вы можете настроить в конфигурации Nginx и получить в PHP через $_SERVER['HTTP_X_ORIGINAL_HOST'].

Пользователь

от deshaun_cormier , 6 месяцев назад

@landen.nienow 

Это происходит потому что при использовании proxy_pass в Nginx, Nginx передает запрос не просто как прокси, а как новый запрос к серверу, указанному в директиве proxy_pass. По умолчанию, при передаче запроса, заголовок "Host" изменяется на значение, указанное в директиве proxy_pass, и этот новый заголовок "Host" будет отображаться в PHP через переменную $_SERVER['HTTP_HOST']. В результате, поддомен не будет отображаться в этой переменной.


Для передачи информации о поддомене в приложение вам нужно настроить Nginx для передачи соответствующих заголовков. Например, вы можете использовать установленные заголовки X-Forwarded-Host или X-Original-Host, которые будут содержать полный адрес запроса, включая поддомен. В конфигурации Nginx это может выглядеть примерно так:

1
2
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Original-Host $host;


Затем, в PHP, вы сможете получить значение поддомена через соответствующие заголовки:

1
$subdomain = $_SERVER['HTTP_X_FORWARDED_HOST'];


Таким образом, вы всегда можете передавать информацию о поддомене или других необходимых заголовках из Nginx внутрь приложения, используя дополнительные заголовки.