Que signifie "Le nom d'hôte fourni n'est pas valide pour ce serveur"?

65

J'utilise un site Web Drupal 8 et, lorsque je navigue sur une page, une page blanche s'affiche avec le message d'erreur suivant.

Le nom d'hôte fourni n'est pas valide pour ce serveur.

Qu'est-ce que ça veut dire? Comment puis-je réparer ça?

mpdonadio
la source
2
Si vous rencontrez ce problème avec la configuration d'un environnement de développement local, reportez-vous à la solution décrite ici.
Patrick Kenny

Réponses:

79

Ce message d'erreur provient d'une fonctionnalité ajoutée à Drupal 8 pour se protéger contre les attaques d'en-tête HTTP Host . La fonctionnalité est également décrite dans l' enregistrement de modification généré pour le correctif.

Essentiellement, il était possible d'usurper l' en-tête de l'hôte HTTP à des fins néfastes et d'inciter Drupal à utiliser un nom de domaine différent dans plusieurs sous-systèmes (notamment la génération de liens). En d'autres termes, l'en-tête HTTP Host doit être considéré comme une entrée utilisateur et non fiable.

Pour lutter contre cela, un nouveau paramètre, a $settings['trusted_host_patterns']été ajouté à Drupal 8 pour configurer une liste de noms d'hôtes "de confiance" à partir desquels le site peut être exécuté. Le paramètre doit être un tableau de modèles d'expression régulière, sans délimiteurs, représentant les noms d'hôtes à partir desquels vous souhaitez autoriser l'exécution.

Par exemple, si vous exécutez votre site à partir d'un seul nom d'hôte "www.exemple.com", vous devez l'ajouter à vos paramètres (généralement situés à l'adresse suivante ./sites/default/settings.php):

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

Notez le ^, \.et $. Ce sont la syntaxe PCRE . Cela signifie simplement que vous voulez faire correspondre "www.example.com" avec précision, sans rien d'extra au début et à la fin, et que les points doivent être traités comme des points et non des caractères génériques.

Si vous utilisez "exemple.com", utilisez simplement:

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

Si vous devez exécuter un site comportant plusieurs domaines et / ou sous-domaines et ne procédez pas à la redirection canonique des URL, votre paramètre ressemblerait à ceci:

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

Cela permet au site de fonctionner avec toutes les variantes de example.com et example.org, avec tous les sous-domaines inclus.

Une fois que vous vous êtes ajusté $settings['trusted_host_patterns']à la valeur appropriée, vous devriez pouvoir accéder à nouveau à votre site.

Vous pouvez également vérifier l’état de vos paramètres d’hôte approuvé à partir de la page de rapport d’état, à l’adresse admin / reports / status

Si vous supprimez complètement le paramètre, le mécanisme de l'hôte approuvé ne sera pas utilisé et une erreur apparaîtra sur la page du rapport d'état. De plus, votre site peut également être vulnérable aux attaques par en-tête HTTP Host.

Si ce paramètre est configuré et que vous voyez ce message, cela signifie probablement que vous avez altéré la syntaxe des expressions régulières. Dans ce cas, prenons le premier exemple, copiez / collez dans vos paramètres, puis modifiez-le pour refléter le nom d'hôte à partir duquel votre site est exécuté.

mpdonadio
la source
5
Je suis l’un des auteurs du correctif et j’ai également écrit le brouillon original de l’enregistrement de modification pour le correctif (d'où provient une grande partie du texte ci-dessus). Cette question et cette réponse ont pour but de donner au message d'erreur "une grande googlabilité" au cas où quelqu'un le rencontrerait. N'hésitez pas à ajouter votre propre réponse si vous pensez pouvoir mieux expliquer ce paramètre. Nous pourrions aussi finir par faire cette CW.
mpdonadio
Il y a des bazillions de configurations lorsque le serveur Drupal n'est pas accessible directement mais est derrière un proxy inverse, ce qui n'est qu'une nuisance. Il devrait y avoir un mécanisme de désinscription propre.
Je crois que c’est le cas maintenant. Des efforts ont été déployés pour l’installer automatiquement dans le programme d’installation, mais cela a été supprimé pour le moment. Aucune validation ne se produit si vous ne définissez pas les noms d'hôte approuvés. En outre, je viens tout juste de faire la connexion entre MPDADADIO et MPD :)
Berdir
Oui, la configuration automatique a été supprimée du correctif qui a été validé. Il est actuellement "opt-in, mais nous vous avertirons s'il n'est pas défini". Il existe un suivi, drupal.org/node/2404259 , pour le définir dans le programme d'installation. @Berdir, j'ai eu une crise d'identité sur Internet il y a quelque temps, et quand je suis devenu mod ici, je ne voulais pas changer mon pseudo :) Mon nom d'utilisateur git si différent aussi ...
mpdonadio
Lorsque j'utilise '^ theming \ .dev $', le message d'erreur suivant s'affiche: Message d'erreur UnexpectedValueException: hôte non approuvé "localhost" dans Symfony \ Component \ HttpFoundation \ Request-> getHost () (ligne 1221 de core / vendor / symfony / http -foundation / Symfony / Component / HttpFoundation / Request.php).
Axel Briche
6

pour l'installation de localhost, vous pouvez utiliser le code suivant dans votre fichier settings.php

$settings['trusted_host_patterns'] = array(
   '^localhost$','^YOUR_IP_ADDRESS$'
 );
Mohan Gathala
la source
3

Cela se produit car trusted_host_patternsvariable dans votre fichier de paramètres. Si vous travaillez sur l'environnement local et que vous souhaitez le remplacer, définissez la section suivante dans votre settings.local.phpfichier:

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

Ou un modèle plus générique :

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

Ou plus spécifique pour les environnements locaux :

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

C'est la solution la plus simple, mais non recommandée car vous devez définir les valeurs appropriées pour éviter d'usurper l'en-tête HTTP Host à des fins néfastes. Si votre site Web ne fonctionne que sur votre section locale, alors ça devrait aller.

Voir: Nouveau paramètre pour la configuration du nom d'hôte approuvé .

Kenorb
la source
1
Vous devriez avoir plus de votes positifs pour cette réponse car elle définit l'utilisation correcte du fichier settings.local.php. Ces paramètres ne doivent probablement pas être définis dans settings.php, car il ne permet pas d’avoir un fichier de paramètres différent pour votre environnement local qui peut être activé / désactivé avec 3 caractères #. Un lien ou des informations sur la configuration locale peuvent gagner plus de votes.
Dimmech
2

Ce problème se produira également si vous avez

<VirtualHost *:443>

quand vous devriez avoir

<VirtualHost *:80>

configurer dans une configuration non ssl (comme pour les environnements de développement et de test) et essayer d'accéder au site sur le port 80

utilisateur356540
la source
0

Ceci est dû à la configuration de l'hôte de confiance du serveur. Il peut produire lorsque vous modifiez le nom de domaine ou 'trusted_host_patterns'. Pour résoudre le Probleme, ajoutez votre nouveau domaine à la DRUPAL_ROOT/sites/SITE_FOLDER/settings.php(Ex: sites/defaults/settings.php)

Exemple: Nom de domaine = newdomain.com

$settings['trusted_host_patterns'] = array(
  '^newdomain.com\.loc$',
  '^www\.newdomain.com\.loc$',
);
Jimmy
la source