В чем разница между этими тремя переменными Nginx $host
, $http_host
и $server_name
?
У меня есть правило перезаписи, где я не уверен, какой из них мне следует использовать:
location = /vb/showthread.php {
# /vb/showthread.php?50271-What-s-happening&p=846039
if ($arg_p) {
return 301 $scheme://$host/forum/index.php?posts/$arg_p/;
}
Я ищу ответ, который не просто говорит «используйте переменную ___ в вашем правиле перезаписи», но также объясняет теоретические различия между ними.
$scheme
и$host
...return 301 /forum/index.php?posts/$arg_p/;
отлично работает.Location
заголовке.Ответы:
Вы должны почти всегда использовать его
$host
, так как гарантированно есть единственное, что имеет смысл, независимо от того, как ведет себя пользовательский агент, если только вам конкретно не нужна семантика одной из других переменных.Разница объясняется в документации по nginx :
$host
содержит «в таком порядке приоритета: имя хоста из строки запроса или имя хоста из поля заголовка запроса« Хост », или имя сервера, соответствующее запросу»$http_host
содержит содержимое поля заголовка HTTP «Host», если оно присутствовало в запросе$server_name
содержитserver_name
виртуальный хост, который обработал запрос, как это было определено в конфигурации nginx. Если aserver
содержит несколькоserver_name
s, в этой переменной будет присутствовать только первый.Так как пользовательские агенты могут отправлять имя хоста в строке запроса, а не в заголовке Host:, хотя это делается редко, за исключением случаев подключения к прокси-серверам, вы должны учитывать это.
Вы также должны учитывать случай, когда пользовательский агент вообще не отправляет имя хоста, например, древние запросы HTTP / 1.0 и современное плохо написанное программное обеспечение. Вы можете сделать это, перенаправив их на универсальный виртуальный хост, который ничего не обслуживает, если вы обслуживаете несколько веб-сайтов или если у вас только один веб-сайт на вашем сервере, вы можете обрабатывать все через один виртуальный хост , В последнем случае вы должны это учитывать.
Только
$host
переменная учитывает все возможные действия, которые пользовательский агент может выполнять при формировании HTTP-запроса.источник
$server_name
безопасно, когдаHost:
поле из UA может содержать произвольный контент.Я хотел бы добавить еще один важный момент, не упомянутый в принятом ответе.
$host
делать НЕ имеют номер порта, в то время как$http_host
DO включать номер порта.редактировать : не всегда.
Я установил заголовок "add_header Y-blog-http_host" $ http_host "всегда;"
Тогда
curl -I -L domain.com:80
(или 443) и заголовок вообще не показывает номер порта. Проверено с помощью nginx-extra 1.10.3. Это потому, что это обычные порты http (s) или конфигурация nginx? Этот комментарий просто говорит о том, что вещи не всегда ведут себя так, как вы думаете.источник
Я тоже некоторое время боролся с этим. Стало ясно, когда я понял, что $ http_XXXXX ссылается на все объявленные переменные заголовка.
Таким образом, $ http_user_agent, $ http_referer - это «АГЕНТ ПОЛЬЗОВАТЕЛЯ», а «REFERER» упоминаются в нижнем и нижнем слешах. Это объяснило мне, откуда взялся ад $ http_upgrade во многих примерах конфигурации NGINX.
Прочитайте его по адресу https://stackoverflow.com/questions/15414810/whats-the-difference-of-host-and-http-host-in-nginx
источник