Предполагая, что у вас есть простая установка (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']в качестве основы для сравнения. Следующий метод взят из конкретного дочернего класса, который я создал named ServerValidator(child of 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-запросы на моем сервере, если не выполнены все четыре условия. Следовательно, с точки зрения запросов POST, неспособность предоставить hostзаголовок HTTP (наличие проверено на более ранние версии) означает гибель для строгих браузеров 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).