Якщо припустимо, що у вас є проста установка (CentOS 7, Apache 2.4.x і PHP 5.6.20) і лише один веб-сайт (не передбачаючи віртуального хостингу) ...
У сенсі PHP $_SERVER['SERVER_NAME']
- це елемент, який PHP реєструє у $_SERVER
надглобальному на основі вашої конфігурації Apache ( **ServerName**
директива з UseCanonicalName On
) в httpd.conf (будь то з включеного файлу конфігурації віртуального хоста, будь-якого, тощо ...). HTTP_HOST походить від host
заголовка HTTP . Трактуйте це як введення користувача. Фільтруйте та перевіряйте перед використанням.
Ось приклад того, де я використовую $_SERVER['SERVER_NAME']
як основу для порівняння. Наступний метод - з конкретного дочірнього класу, який я зробив на ім'я ServerValidator
(дитина від Validator
). ServerValidator
перевіряє шість або сім елементів у $ _SERVER перед їх використанням.
Визначаючи, чи запит HTTP є POST, я використовую цей метод.
public function isPOST()
{
return (($this->requestMethod === 'POST') && // Ignore
$this->hasTokenTimeLeft() && // Ignore
$this->hasSameGETandPOSTIdentities() && // Ingore
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')));
}
До моменту виклику цього методу все фільтрування та перевірка відповідних елементів $ _SERVER відбулася б (і встановлено відповідні властивості).
Лінія ...
($this->httpHost === filter_input(INPUT_SERVER, 'SERVER_NAME')
... перевіряє, чи відповідає $_SERVER['HTTP_HOST']
значення (в кінцевому рахунку отримане із запитуваного host
заголовка HTTP) $_SERVER['SERVER_NAME']
.
Тепер я використовую суперглобального Speak пояснити мій приклад, але це тільки тому , що деякі люди не знайомі з INPUT_GET
, INPUT_POST
і INPUT_SERVER
в ставленні до filter_input_array()
.
Суть полягає в тому, що я не обробляю POST-запити на своєму сервері, якщо всі 4 умови не виконані. Отже, з точки зору POST-запитів, ненадання HTTP- host
заголовка (наявність перевірених раніше) заклинання прирікає строгі браузери HTTP 1.0 . Крім того, запитуваний хост повинен збігатися зі значенням для ServerName
в httpd.conf , і, розширенням, значення для $_SERVER('SERVER_NAME')
в $_SERVER
суперглобальний. Знову ж, я б використовував INPUT_SERVER
функції фільтра PHP, але ви вловили мій дрейф.
Майте на увазі, що Apache часто використовує ServerName
в стандартних переадресаціях (таких як залишення останньої косої риски URL-адреси: Наприклад, http://www.foo.com стає http://www.foo.com/ ), навіть якщо ви цього не робите за допомогою переписування URL-адрес.
Я використовую $_SERVER['SERVER_NAME']
як стандарт, ні $_SERVER['HTTP_HOST']
. У цьому питанні багато і назад. $_SERVER['HTTP_HOST']
може бути порожнім, тому це не повинно бути основою для створення конвенцій коду, таких як мій публічний метод вище. Але, тільки тому, що обидва можуть бути встановлені, це не гарантує їх рівності. Тестування - найкращий спосіб точно знати (маючи на увазі версію Apache та версію PHP).