Intereting Posts

Как получить реальное имя хоста или сервера в PHP

Как получить реальное имя хоста, не используя $ _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']