Ви майже завжди повинні користуватися $host
, оскільки це єдине гарантоване щось розумне, незалежно від того, як поводиться агент-користувач, якщо вам конкретно не потрібна семантика однієї з інших змінних.
Різниця пояснюється в документації nginx :
$host
містить "у цьому порядку пріоритетності: ім'я хоста з рядка запиту або ім'я хоста з поля заголовка запиту" Хост "або ім'я сервера, що відповідає запиту"
$http_host
містить вміст поля заголовка HTTP "Хост", якщо він був присутній у запиті
$server_name
містить server_name
віртуальний хост, який обробив запит, як це було визначено в конфігурації nginx. Якщо a server
містить кілька server_name
s, у цій змінній буде присутній лише перший.
Оскільки для користувальницьких агентів законним є надсилання імені хоста в рядку запиту, а не в заголовку Host: хоча це робиться рідко, за винятком підключення до проксі, вам доведеться це враховувати.
Вам також доведеться враховувати випадок, коли агент-користувач взагалі не надсилає ім'я хоста, наприклад стародавні запити HTTP / 1.0 та сучасне програмне забезпечення, яке погано написано. Ви можете зробити це, переадресувавши їх на віртуальний хост, який нічого не обслуговує, якщо ви обслуговуєте кілька веб-сайтів, або якщо у вас на сервері є лише один веб-сайт, ви можете обробити все через один віртуальний хост . В останньому випадку ви також повинні це враховувати.
Лише $host
змінна обліковує всі можливі речі, які може зробити агент-користувач при формуванні HTTP-запиту.
$scheme
і$host
...return 301 /forum/index.php?posts/$arg_p/;
працює чудово.