默认值:[](空列表)
**ALLOWED_HOSTS**是一个字符串列表,代表了这个Django网站可以服务的主机名或域名。这是为了阻止[HTTP Host头攻击](https://docs.djangoproject.com/en/1.10/topics/security/#host-headers-virtual-hosting)而采用的一种安全措施,这种攻击即使在很多看上去很安全的服务器配置下依然能够成功。
这个列表中的值,可以是全名(比如: **'www.example.com'**), 在这种情况下,它们会直接与所要求的Host头进行匹配(大小写不区分,不包括端口号)。如果一个值以点号开始,则可当做一个子域名通配符:**'.example.com'**会匹配**'example.com', 'www.example.com'**, 以及**example.com**的其它任意子域名。如果有'\*'这个值,那么它会匹配任何字符串,在这种情况下,你就需要提供你自己的Host头验证机制(可能是在一个中间件中;如果真是这样,那么这个中间件就必须放在[MIDDLEWARE](https://docs.djangoproject.com/en/1.10/ref/settings/#std:setting-MIDDLEWARE)列表的第一位)
Django也支持任一条目的[域名全称](https://en.wikipedia.org/wiki/Fully_qualified_domain_name)。有一些浏览器在Host头中会包含一个结尾点号,Django在执行host验证时会过滤掉它。
如果Host头(如果启用了**USE_X_FORWARDED_HOST**,则是**X-Forwarded-Host**)不匹配列表中任何一个值,那么 **django.http.HttpRequest.get_host()**方法会抛出**SuspiciousOperation**异常。
当**DEBUG**设为**True**,且**ALLOWED_HOSTS**为空时,会使用**['localhost', '127.0.0.1', '[::1]']**来验证Host头。
这个验证只会通过get_host()方法来执行,如果你的代码是通过request.META直接访问Host头,那么你就绕开了这一层安全保护。
>[warning] 在老的Django版本中,如果DEBUG=True,ALLOWED_HOSTS将不会被检查。这在Django 1.9.11和Django 1.8.16版本中被改变,也是为了阻止一种DNS重绑定攻击