Предполагается, что у вас простая установка (CentOS 7, Apache 2.4.x и PHP 5.6.20) и только один веб-сайт (без виртуального хостинга) ...
В смысле PHP, $_SERVER['SERVER_NAME']
это элемент, который PHP регистрирует в суперглобальном $_SERVER
на основе вашей конфигурации Apache (директива **ServerName**
с UseCanonicalName On
) в httpd.conf (будь то из включенного файла конфигурации виртуального хоста, что угодно, и т. д.). HTTP_HOST выводится из заголовка HTTP host
.Относитесь к этому как к пользовательскому вводу.Фильтруйте и проверяйте перед использованием.
Вот пример, где я использую $_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']
.
Теперь я использую superglobal talk для объяснения моего примера, но это только потому, что некоторые люди не знакомы с INPUT_GET
, INPUT_POST
и INPUT_SERVER
в отношении filter_input_array()
.
Суть в том, что я не обрабатываю POST-запросы на моем сервере, если all четыре условия выполнены.Следовательно, с точки зрения запросов POST, неспособность предоставить заголовок HTTP host
(наличие проверено ранее) заклинания doom для строгих 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).