Возможный дубликат:
HTTP_HOST и SERVER_NAME
 В чем разница между $_SERVER['HTTP_HOST'] и $_SERVER['SERVER_NAME'] ? 
  $_SERVER['SERVER_NAME'] указывает значение имени сервера, как определено в конфигурации хоста (например, для файла Apache Apache .conf). 
  $_SERVER['HTTP_HOST'] дает вам доменное имя, через которое выполняется текущий запрос, и имеет более непосредственное отношение к запросу. 
  HTTP_HOST обычно более полезен в большинстве приложений, поскольку он напрямую относится к запросу, тогда как SERVER_NAME может возвращать любое значение в файле conf и вообще ничего не сообщает о запросе. 
  Я приведу вам пример того, как HTTP_HOST может отличаться от SERVER_NAME .  Предположим, что у вас есть хост, определенный в Apache с именем domain.com и IP-адресом 1.2.3.4 . 
Давайте посмотрим на два URL-адреса входящих запросов и покажем разницу между этими переменными:
 http://www.domain.com HTTP_HOST = www.domain.com SERVER_NAME = domain.com http://1.2.3.4 HTTP_HOST = 1.2.3.4 SERVER_NAME = domain.com 
Таким образом, HTTP_HOST больше привязан к запросу, тогда как SERVER_NAME определяется конфигурацией сервера.
  HTTP_HOST – это заголовок Host: отправленный клиентом.  В результате это может быть немного менее надежным.  SERVER_NAME определяется конфигурацией вашего сервера , независимо от ввода пользователя. 
Разница в поведении тонкая. Здесь показаны несколько хороших примеров: http://shiflett.org/blog/2006/mar/server-name-versus-http-host
Документы объясняют это хорошо
'SERVER_NAME' Имя хоста сервера, под которым выполняется текущий скрипт. Если скрипт запущен на виртуальном хосте, это будет значение, определенное для этого виртуального хоста.
'HTTP_HOST' Содержимое заголовка Host: из текущего запроса, если таковой имеется.
 HTTP_HOST 
Содержимое заголовка Host: из текущего запроса, если таковой имеется.
 SERVER_NAME 
Имя хоста сервера, под которым выполняется текущий скрипт. Если скрипт запущен на виртуальном хосте, это будет значение, определенное для этого виртуального хоста.