Как получить реальное имя хоста, не используя $ _SERVER ['SERVER_NAME'] в PHP? Есть ли еще более надежный способ получить его?
Я создал функцию, которая получает имя хоста от пути к домену.
Я бы хотел избежать использования переменной $ _SERVER ['SERVER_NAME'], потому что ее можно подделать, отправив измененные заголовки в HTTP-запрос.
Это моя текущая реализация (это работает, если путь имеет фактическое имя домена в нем. Например: /vhosts/website.com/public_html):
function getServerName() { $path = realpath(__FILE__); $url = array(); preg_match_all("/\/[a-z0-9-]+(\.[a-z0-9-]+)+/i", $path, $url); // 4 is minimum requirement for the address (eg: http://www.in.tv) if (strlen($url[0][0]) > 4) { $result = str_replace("/", "", $url[0][0]); return $result; } else return false; }
Благодаря!
Редактировать: как указано Gumbo, исходный плакат, вероятно, означает HTTP_HOST, а не HOST_NAME. В противном случае, мой ответ прост.
Переменная HTTP_HOST отражает имя домена, которое посетитель использовал для доступа к сайту. Если это не имеет никакого отношения к пути к файлу! Его значение удобно хранить в $ _SERVER ['HTTP_HOST']. Есть ли другой способ его получить? Конечно, обычно есть несколько способов сделать что-то. Например, это работает, когда PHP работает как модуль Apache.
<?php $request_headers = apache_request_headers(); echo $request_headers['Host']; ?>
Вопрос в том, почему кто-то хочет это делать? Зачем заменить надежный стандартный метод на изворотливое обходное решение, которое в конечном итоге извлекает одни и те же данные из одного и того же места?
Вы обеспокоены тем, что HTTP-запрос изменен в $ _SERVER ['HTTP_HOST']. Конечно, это так: вот откуда. Браузер должен указать, на каком веб-сайте он хочет посетить (это база виртуальных хостов на основе имен), и если он отправит значение изгоев, то он просто не достигнет сайта.
Если вы хотите, чтобы имя сервера не было установлено клиентом, используйте $_SERVER['SERVER_NAME']
. Он задается самим сервером, но также может быть подделан при определенных обстоятельствах, используя ошибку, как указывает Gumbo и ссылается на комментарии.
Я думаю, что вы имеете в виду
$_SERVER['HTTP_HOST'];
который, учитывая префикс HTTP, означает, что он поступает из заголовков HTTP.
Вы можете использовать:
$_SERVER['SERVER_NAME']
который определяется сервером и не может быть изменен с помощью запроса?
это получит имя хоста на стороне сервера, но если вы работаете на коммерческом хосте (не принимаете себя), я не думаю, что это будет полезно.
$host = php_uname( 'n' );
Если вы используете Apache, что вам нужно сделать, это сделать ваш сервер / сайт ответом только на определенные имена (иначе должно быть значение по умолчанию, которое не так много). Вы можете ServerAlias
директивы ServerName
и ServerAlias
.
Конечно, $_SERVER['HTTP_HOST']
может быть изменен клиентом – потому что на самом деле он отправляется клиентом. Это часть протокола http. Если вы хотите получить имя первичного сервера, определенное в конфигурации vhost для apache, или что угодно, вы можете получить доступ к $_SERVER['SERVER_NAME']
как это было предложено другими.
Я предлагаю __FILE__
извлекать доменное имя из пути к файлу сервера (который хранится в __FILE__
), поскольку он может сделать ваше приложение неперемещаемым (он больше не будет агрегированным местом хранения).
Вы можете увидеть содержимое массива, сбросив его в скрипт с помощью var_dump($_SERVER)
но имейте в виду, что не все веб-серверы и все настройки веб-сервера выставляют одну и ту же среду. Это описано в документации веб-сервера, и я думаю, что это частично описано в онлайн-документах php.
Обновление / Важное примечание. Как указывали другие, содержимое $_SERVER['SERVER_NAME']
может быть подделано, если apache настроен для UseCanonicalName off
(это может быть настройка по умолчанию, если вы используете, например, хостинг на основе Plesk). Так что на самом деле с __FILE__
можно решить это (если ваш корневой каталог содержит имя хоста). Большая проблема первого подхода заключается в том, что его можно использовать для ввода любого типа материала в ваше приложение (SQL, JavaScript), поскольку программисты php обычно считают, что SERVER_NAME
является пользователем и, следовательно, не применяют к нему никакой очистки.
Вы этого не сделаете. Это цель переменных $ _SERVER. Если вы хотите получить HOST_NAME из пути, вы должны сначала получить PATH из $ _SERVER ['HTTP_HOST']