Предполагая, что у вас есть простая установка (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).