您的位置:

解决方案:django DisallowedHost(msg)

  发布时间:2023-03-28 17:12:13
报错的原因是Django中的一个异常,表示请求来自于不允许的主机。这通常是因为在Django配置中设置了ALLOWED_HOSTS变量,并将其设置为特定域名列表,而请求来自不在该列表中的域。所以你需要确认在web服务器的配置里有设置ServerName或者ServerAlias,使得web服务器能正确的将主机头传递给Django应用程序如果你是用的Django自带的web服务器,确保你在运行服务器时传入了正确的主机名。通过上面的几种方式,您应该能够解决DisallowedHost异常,并让您的Django应用程序正常工作。

报错的原因

DisallowedHost(msg)是Django中的一个异常,表示请求来自于不允许的主机。

这通常是因为在Django配置中设置了ALLOWED_HOSTS变量,并将其设置为特定域名列表,而请求来自不在该列表中的域。

为了解决这个问题,您需要将请求来源的域名添加到ALLOWED_HOSTS列表中。如果您要允许所有域访问您的应用程序,可以将ALLOWED_HOSTS设置为 ['*']。


ALLOWED_HOSTS = ['example.com', 'localhost', '127.0.0.1']

or


ALLOWED_HOSTS = ['*']

需要注意的是,在生产环境不建议使用'*'来允许所有域访问,因为这样会增加安全风险。

需要注意的是,在生产环境不建议使用'*'来允许所有域访问,因为这样会增加安全风险。使用明确列出的域名来限制访问会更加安全。

如果您在使用Django自带的Web服务器(例如runserver命令)时看到了此错误,那么您可能需要确保您在运行服务器时提供了正确的主机名。例如,如果您想要在localhost上运行服务器,那么可以使用以下命令:


python manage.py runserver localhost:8000

如果您正在使用第三方Web服务器(如Apache或Nginx)代理请求,那么您需要确保Web服务器正在将正确的主机头传递给Django应用程序。例如,在Apache中,您可以在虚拟主机配置中使用`ServerName`指令来设置主机名。

另外,在Django中,ALLOWED_HOSTS还有一个重要的用途就是防止DNS重新绑定攻击,所以在生产环境中设置ALLOWED_HOSTS是非常重要的。

如何解决

解决此错误的具体步骤取决于您的环境和您使用的Web服务器。

一种解决方案是将ALLOWED_HOSTS设置为包含您预期请求来源域名的列表,例如:


ALLOWED_HOSTS = ['example.com', 'localhost', '127.0.0.1']

如果你是在本地开发或者你知道你服务器的ip地址也可以把ip地址添加到这个里面

如果你是用Apache或Nginx等第三方web服务器代理请求,那么你需要确保web服务器正在传递正确的主机头给Django应用程序。 所以你需要确认在web服务器的配置里有设置ServerName或者ServerAlias,使得web服务器能正确的将主机头传递给Django应用程序

如果你是用的Django自带的web服务器,确保你在运行服务器时传入了正确的主机名。

通过上面的几种方式,您应该能够解决DisallowedHost(msg)异常,并让您的Django应用程序正常工作。

使用例子

当然,我可以为您提供一些例子。

例1:配置ALLOWED_HOSTS来允许所有域访问您的应用程序


#settings.py
ALLOWED_HOSTS = ['*']

例2:配置ALLOWED_HOSTS来允许特定的域访问您的应用程序


#settings.py
ALLOWED_HOSTS = ['example.com', 'www.example.com']

例3: 使用Apache或Nginx设置正确的主机头

在Apache中设置ServerName



    ServerName example.com
    ServerAdmin webmaster@example.com
    ...

在Nginx中设置Server_name


server {
    listen 80;
    server_name example.com;
    ...
}

例4: 使用Django自带的web服务器设置正确的主机名


python manage.py runserver localhost:8000

通过上面的例子,您应该能够对Django配置ALLOWED_HOSTS变量和配置第三方Web服务器来传递正确的主机头有更深入的理解。