Что означает «Предоставленное имя хоста недопустимо для этого сервера»?

65

Я работаю на веб-сайте Drupal 8, и когда я захожу на любую страницу, я получаю простую белую страницу со следующим сообщением об ошибке.

Указанное имя хоста недопустимо для этого сервера.

Что это значит? Как я могу это исправить?

mpdonadio
источник
2
Если у вас возникла проблема с настройкой локальной среды разработки, см. Решение, описанное здесь.
Патрик Кенни

Ответы:

79

Это сообщение об ошибке исходит от функции, которая была добавлена ​​в Drupal 8 для защиты от атак заголовка HTTP-хоста . Эта функция также описана в записи изменений , созданной для исправления.

По сути, было возможно подделать заголовок HTTP Host для гнусных целей и обманом заставить Drupal использовать другое доменное имя в нескольких подсистемах (в частности, создание ссылок). Другими словами, заголовок HTTP Host должен рассматриваться как ввод пользователя, а не как доверенный.

Для борьбы с этим $settings['trusted_host_patterns']в Drupal 8 был добавлен новый параметр для настройки списка «доверенных» имен хостов, с которых может работать сайт. Параметр должен быть массивом шаблонов регулярных выражений без разделителей, представляющих имена хостов, с которых вы хотели бы разрешить запуск.

Например, если вы запускаете свой сайт с одного имени хоста "www.example.com", то вы должны добавить это в свои настройки (обычно они находятся в ./sites/default/settings.php):

$settings['trusted_host_patterns'] = array(
  '^www\.example\.com$',
);

Обратите внимание ^, \.и $. Это синтаксис PCRE . Это просто означает, что вы хотите точно соответствовать «www.example.com», без лишних символов в начале и в конце, и что точки должны рассматриваться как точки, а не как символы подстановки.

Если вы работаете с "example.com", просто используйте:

$settings['trusted_host_patterns'] = array(
  '^example\.com$',
);

Если вам нужно запустить сайт из нескольких доменов и / или поддоменов и не выполнять каноническое перенаправление URL, то ваши настройки будут выглядеть примерно так:

$settings['trusted_host_patterns'] = array(
  '^example\.com$',
  '^.+\.example\.com$',
  '^example\.org',
  '^.+\.example\.org',
);

Это позволяет сайту запускать все варианты example.com и example.org, включая все субдомены.

Как только вы настроите $settings['trusted_host_patterns']правильное значение, вы сможете снова перейти на свой сайт.

Вы также можете проверить состояние параметров доверенного хоста на странице отчета о состоянии, которая находится по адресу admin / reports / status

Если вы полностью удалите этот параметр, механизм доверенного хоста не будет использоваться, и вы увидите ошибку на странице отчета о состоянии. Кроме того, ваш сайт также может быть уязвим к атакам заголовков HTTP Host.

Если у вас настроен этот параметр и вы видите это сообщение, это, вероятно, означает, что вы испортили синтаксис регулярного выражения. В этом случае возьмите первый пример и скопируйте / вставьте в ваши настройки, а затем отредактируйте его, чтобы отразить имя хоста, с которого работает ваш сайт.

mpdonadio
источник
5
Я являюсь одним из авторов патча, а также написал оригинальный черновик записи изменений для патча (отсюда большая часть вышеприведенного текста). Этот вопрос и ответ должен дать сообщение об ошибке «высокая googlability» в случае, если кто-то сталкивается с ним. Пожалуйста, не стесняйтесь добавлять свой ответ, если вы считаете, что можете лучше объяснить этот параметр. Мы также можем сделать это CW.
mpdonadio
Существует несколько миллиардов конфигов, когда сервер Drupal недоступен напрямую, но находится за обратным прокси-сервером, и это просто неприятность. Должен быть чистый механизм отказа.
Я полагаю, что сейчас, были попытки автоматически установить его в установщике, но это было удалено снова на данный момент. Проверка не происходит, если вы не установили доверенные имена хостов. Кроме того, я только сейчас установил связь между mpdonadio и MPD :)
Berdir
Да, автоконфигурация была удалена из патча, который был зафиксирован. В настоящее время он включен, но мы будем предупреждать вас, если он не установлен. Существует продолжение, drupal.org/node/2404259 , чтобы установить его в установщике. @Berdir, у меня недавно был кризис идентичности в интернете, и когда я стал здесь модом, я не хотел менять свой псевдоним :) Мое имя пользователя git, если тоже другое ...
mpdonadio
Когда я использую «^ theming \ .dev $», у меня появляется эта ошибка: сообщение об ошибке UnexpectedValueException: ненадежный хост «localhost» в Symfony \ Component \ HttpFoundation \ Request-> getHost () (строка 1221 из core / vendor / symfony / http -foundation / Symfony / Компонент / HttpFoundation / Request.php).
Аксель Бриш
6

для локальной установки вы можете использовать следующий код в файле settings.php

$settings['trusted_host_patterns'] = array(
   '^localhost$','^YOUR_IP_ADDRESS$'
 );
Мохан Гатала
источник
3

Это происходит потому, что trusted_host_patternsпеременная в вашем файле настроек. Если вы работаете в локальной среде и хотите переопределить это, определите следующий раздел в вашем settings.local.phpфайле:

/*
 * Drupal Trusted Host Patterns
 */
$settings['trusted_host_patterns'] = [];

Или более общий шаблон :

$settings['trusted_host_patterns'] = [ '.*' ];

Или, более конкретно, для местных условий :

$settings['trusted_host_patterns'] = array(
  '^172\.20.\0.\3$',
  '^localhost$',
);

Это самое простое решение, но не рекомендуется, так как вы должны установить правильные значения, чтобы избежать подмены заголовка HTTP Host для злонамеренных целей. Если ваш сайт работает только на вашем локальном компьютере, то все будет в порядке.

См .: Новые настройки для конфигурации доверенного имени хоста .

kenorb
источник
1
Вы должны иметь больше голосов за этот ответ, потому что он определяет правильное использование файла settings.local.php. Эти настройки, вероятно, не должны быть определены в файле settings.php, поскольку они не используют другой файл настроек для вашей локальной среды, который можно включать / выключать с помощью 3 # символов. Ссылка или некоторая информация о локальной настройке может заработать больше голосов.
Диммех
2

Эта проблема также возникнет, если у вас есть

<VirtualHost *:443>

когда вы должны иметь

<VirtualHost *:80>

установить в настройках не-ssl (например, для сред разработки / тестирования) и попытаться получить доступ к сайту через порт 80

user356540
источник
0

Это связано с конфигурацией доверенного хоста сервера. Это может выдать, когда вы меняете доменное имя или 'trusted_host_patterns'. Для решения problème, добавить новый домен к DRUPAL_ROOT/sites/SITE_FOLDER/settings.php(Ex: sites/defaults/settings.php)

Пример: доменное имя = newdomain.com

$settings['trusted_host_patterns'] = array(
  '^newdomain.com\.loc$',
  '^www\.newdomain.com\.loc$',
);
Джимми
источник