为什么 Django 抛出错误 "DisallowedHost at /"?
Why is Django throwing error "DisallowedHost at /"?
我正在使用这个 Digital Ocean tutorial 设置我自己的 Django 服务器。我在每个步骤之后创建了 Django 框架,运行 服务器使用此命令:
./manage.py runserver 0.0.0.0:8000
当我尝试访问8000端口的IP时,出现如下错误:
DisallowedHost at /
Invalid HTTP_HOST header: 'XXX.XXX.XXX.XXX:8000'. You may need to add u'XXX.XXX.XXX.XXX' to ALLOWED_HOSTS.
(IP 替换为 X)
为什么会这样?
在您的 settings.py
中,有一个名为 ALLOWED_HOSTS
的列表。您需要将在错误中看到的 IP 地址添加到该列表中:
ALLOWED_HOSTS = ['XX.XX.XX.XX']
注意:仅添加IP地址,不端口(例如, 127.0.0.1
而不是 127.0.0.1:8000
)
解释:
Django 检查 HTTP 请求的 Host
header 以查找允许主机内的 url/ip 地址。
来自 django 网站:
This is a security measure to prevent HTTP Host header attacks, which are possible even under many seemingly-safe web server configurations.
https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts
包括两者('www.name.com'、'ip.ip.ip.ip')
设置 Debug = True,然后重试 IP 和 URL 地址。
转到 Traceback 部分,找到消息 [ raise DisallowedHost(msg) ]
点击 -> ▼ 本地变量
它将显示传入域名和允许主机的设置:
*Variable Value
*allowed_hosts ['ip.ip.ip.ip', 'name.com']
*domain 'something.com'
*
将传入值复制到您的settings.py。如果您看到旧设置,请重新启动 server\nginx
对于开发,您可以使用 *
通配符来允许 settings.py
中的所有主机:
ALLOWED_HOSTS = ['*']
重要
在生产环境中部署应用程序时修改此配置。
对于本地主机上的 运行 Django 项目,由 "ngrok"
免费托管
运行 ngrok http 8000
(在您的项目中 运行 之前,请确保您的项目需要 运行 在本地主机上,例如 - python manage.py 运行 服务器)
http://563ae936.ngrok.io -> http://localhost:8000
编辑Setting.py
ALLOWED_HOSTS = ['563ae936.ngrok.io', 'localhost', '127.0.0.1', 'testserver']
此处“563ae936.ngrok.io”用删除 http:// 或 https://[= 替换您的主机名11=]
转到setting.py
ALLOWED_HOSTS = ['*']
有时仅仅将它添加到主机是不够的,因为一次又一次的失败尝试。有时卡在缓存中,即使您做对了所有事情,您也会遇到同样的错误。在那种情况下,对我有用的是更改端口,从 8081 和缓存问题结束。
我运行是这样的:
python3 manage.py runserver 127.0.0.1:8081
我正在使用这个 Digital Ocean tutorial 设置我自己的 Django 服务器。我在每个步骤之后创建了 Django 框架,运行 服务器使用此命令:
./manage.py runserver 0.0.0.0:8000
当我尝试访问8000端口的IP时,出现如下错误:
DisallowedHost at /
Invalid HTTP_HOST header: 'XXX.XXX.XXX.XXX:8000'. You may need to add u'XXX.XXX.XXX.XXX' to ALLOWED_HOSTS.
(IP 替换为 X)
为什么会这样?
在您的 settings.py
中,有一个名为 ALLOWED_HOSTS
的列表。您需要将在错误中看到的 IP 地址添加到该列表中:
ALLOWED_HOSTS = ['XX.XX.XX.XX']
注意:仅添加IP地址,不端口(例如, 127.0.0.1
而不是 127.0.0.1:8000
)
解释:
Django 检查 HTTP 请求的 Host
header 以查找允许主机内的 url/ip 地址。
来自 django 网站:
This is a security measure to prevent HTTP Host header attacks, which are possible even under many seemingly-safe web server configurations.
https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts
包括两者('www.name.com'、'ip.ip.ip.ip') 设置 Debug = True,然后重试 IP 和 URL 地址。
转到 Traceback 部分,找到消息 [ raise DisallowedHost(msg) ] 点击 -> ▼ 本地变量
它将显示传入域名和允许主机的设置:
*Variable Value
*allowed_hosts ['ip.ip.ip.ip', 'name.com']
*domain 'something.com'
*
将传入值复制到您的settings.py。如果您看到旧设置,请重新启动 server\nginx
对于开发,您可以使用 *
通配符来允许 settings.py
中的所有主机:
ALLOWED_HOSTS = ['*']
重要
在生产环境中部署应用程序时修改此配置。
对于本地主机上的 运行 Django 项目,由 "ngrok"
免费托管运行 ngrok http 8000
(在您的项目中 运行 之前,请确保您的项目需要 运行 在本地主机上,例如 - python manage.py 运行 服务器)
http://563ae936.ngrok.io -> http://localhost:8000
编辑Setting.py
ALLOWED_HOSTS = ['563ae936.ngrok.io', 'localhost', '127.0.0.1', 'testserver']
此处“563ae936.ngrok.io”用删除 http:// 或 https://[= 替换您的主机名11=]
转到setting.py
ALLOWED_HOSTS = ['*']
有时仅仅将它添加到主机是不够的,因为一次又一次的失败尝试。有时卡在缓存中,即使您做对了所有事情,您也会遇到同样的错误。在那种情况下,对我有用的是更改端口,从 8081 和缓存问题结束。
我运行是这样的:
python3 manage.py runserver 127.0.0.1:8081