【问题标题】:Why is Django throwing error "DisallowedHost at /"?为什么 Django 会抛出错误“DisallowedHost at /”?
【发布时间】:2017-04-01 17:45:55
【问题描述】:

我正在使用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)

为什么会这样?

【问题讨论】:

    标签: python django django-settings


    【解决方案1】:

    有时仅将其添加到主机中是不够的,因为一次又一次的沮丧尝试。有时卡在缓存中,即使您做对了所有事情,您也会遇到同样的错误。在那种情况下,对我有用的是更改端口,从 8081 和缓存问题结束。

    我是这样运行的:

    python3 manage.py runserver 127.0.0.1:8081
    

    【讨论】:

      【解决方案2】:

      对于开发,您可以使用* 通配符来允许settings.py 中的所有主机:

      ALLOWED_HOSTS = ['*']

      重要

      在生产环境中部署应用时修改此配置。

      【讨论】:

        【解决方案3】:

        在您的settings.py 中,有一个名为ALLOWED_HOSTS 的列表。您需要将错误中看到的 IP 地址添加到该列表中:

        ALLOWED_HOSTS = ['XX.XX.XX.XX']

        注意添加IP地址,端口(例如127.0.0.1而不是127.0.0.1:8000

        说明:

        Django 检查 HTTP 请求的 Host 标头中是否存在允许主机内的 url/ip 地址。

        来自 django 网站:

        这是一种防止 HTTP Host 标头攻击的安全措施,即使在许多看似安全的 Web 服务器配置下也可能发生这种攻击。

        https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts

        【讨论】:

        • 非常感谢!如果我希望其他 IP 对我的服务器进行 API 调用,是否也需要允许这些主机?
        • @alukin 你可以使用通配符甚至允许所有主机(可能是也可能不是一个好主意:))
        • @alukin 我不同意 Aditya。在其他 IP 进行 API 调用的情况下,您不需要添加它们。 ALLOWED_HOSTS 是您的服务器应该响应的主机名列表,而不是
        • @Foon 你说得对。人们总是混淆这个属性。
        • 假设请求来自运行 Django 的同一个实例,是否有任何方法可以自动执行此操作?如果我必须启动新服务器(使用新 IP),最好避免手动将新 IP 添加到设置文件中。
        【解决方案4】:

        用于在本地主机上运行 Django 项目,由“ngrok”免费托管

        运行 ngrok http 8000

        (在您的项目中运行之前,请确保您的项目需要在本地主机上运行,​​例如-python manage.py runserver)

        http://563ae936.ngrok.io -> http://localhost:8000

        编辑设置.py

        ALLOWED_HOSTS = ['563ae936.ngrok.io', 'localhost', '127.0.0.1', 'testserver']

        这里 "563ae936.ngrok.io" 将您的主机名替换为删除 http://https://

        【讨论】:

        • .io 域名从何而来?
        • 打开“dashboard.ngrok.com/get-started”并为您的操作系统下载 ngrok。之后,将提取的“ngrok.exe”文件粘贴到您的项目文件夹中 manage.py 可用的同一目录中。之后运行“run ngrok http 8000”,这将显示 .io 域名。
        【解决方案5】:

        进入setting.py

        ALLOWED_HOSTS = ['*']

        【讨论】:

        • randyr 已于 2018 年 11 月回复了此问题。请参考发布重复的答案。
        【解决方案6】:

        同时包含('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 中。如果您看到旧设置重新启动服务器\nginx

        【讨论】:

          猜你喜欢
          • 2017-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-12-10
          • 2019-06-13
          • 2021-06-17
          • 2015-02-25
          相关资源
          最近更新 更多