“提供的主机名对该服务器无效”是什么意思?


64

我正在运行一个Drupal 8网站,当我浏览到任何页面时,都会得到一个纯白色的页面,上面只有以下错误消息。

提供的主机名对此服务器无效。

这是什么意思?我该如何解决?


2
如果在配置本地开发环境时遇到此问题,请参阅此处概述的解决方案。
帕特里克·肯尼

Answers:


78

此错误消息来自于Drupal 8中添加的一项功能,该功能可以防止HTTP Host标头攻击。在为修补程序生成的更改记录中也描述了该功能。

从本质上讲,可以出于恶意目的欺骗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标头攻击。

如果配置了此设置并看到此消息,则可能意味着您弄乱了正则表达式语法。在这种情况下,请使用第一个示例,然后将其复制/粘贴到您的设置中,然后对其进行编辑以反映您的网站运行所在的主机名。


5
我是该修补程序的作者之一,还写了该修补程序的变更记录的原始草案(这是上面许多文本的来源)。这个问题和答案是为了给错误消息“高可探性”,以防万一有人遇到它。如果您认为自己可以更好地解释此设置,请随时添加自己的答案。我们也可能最终会制作此CW。
mpdonadio

当无法直接访问Drupal服务器,但在反向代理后面时,将有不计其数的配置,这仅仅是一个麻烦。应该有一个干净的退出机制。

我相信现在已经在自动在安装程序中进行设置了,但是现在又被删除了。如果未将其设置为可信主机名,则不会进行任何验证。另外,我只是在mpdonadio和MPD之间建立了连接:)
Berdir 2015年

是的,自动配置已从提交的补丁中删除。当前是“选择加入,但如果未设置,我们会警告您”。有一个后续操作drupal.org/node/2404259,可以在安装程序中进行设置。@Berdir,前段时间我遇到了互联网身份危机,当我成为这里的mod时,我也不想更改自己的昵称:)我的git用户名也一样...
mpdonadio

当我使用'^ theming \ .dev $'时,出现以下错误:错误消息UnexpectedValueException:Symfony \ Component \ HttpFoundation \ Request-> getHost()中的不受信任的主机“ localhost”(core / vendor / symfony / http的第1221行) -foundation / Symfony / Component / HttpFoundation / Request.php)。
Axel Briche 2015年


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标头。如果您的网站仅在本地运行,那么您应该可以。

请参阅:可信主机名配置的新设置


1
您应该对此答案有更多支持,因为它定义了settings.local.php文件的正确用法。这些设置可能不应该在settings.php中定义,它违反了为您的本地环境使用其他设置文件的目的,该文件可以使用3#个字符来打开/关闭。有关本地设置的链接或某些信息可能会赢得更多选票。
dimmech

2

如果您有,也会发生此问题

<VirtualHost *:443>

什么时候应该

<VirtualHost *:80>

在非SSL设置中进行设置(例如用于开发/测试环境),然后尝试通过端口80访问该站点


0

这是由于服务器的受信任主机配置。当您更改域名或时,它会产生'trusted_host_patterns'。要解决probleme,添加新域名的DRUPAL_ROOT/sites/SITE_FOLDER/settings.php(例如:sites/defaults/settings.php

示例:域名= newdomain.com

$settings['trusted_host_patterns'] = array(
  '^newdomain.com\.loc$',
  '^www\.newdomain.com\.loc$',
);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.