Django中的"Bad request 400",超出 ALLOWED_HOSTS

举报
Tiamo_T 发表于 2021/11/25 13:36:03 2021/11/25
【摘要】 Settings.Py 中缺少 ALLOWED_HOSTSsettings.pyALLOWED_HOSTS = ("example.com",)其中 example.com 实际上是您运行应用程序的域。这就是诀窍,问题是在生产模式下(DEBUG=False),Django 并不服务于所有域。最近,在使用gunicorn和nginx部署Django应用程序时,我遇到了以下问题:应用程序对所有请...

Settings.Py 中缺少 ALLOWED_HOSTS

settings.py

ALLOWED_HOSTS = ("example.com",)

其中 example.com 实际上是您运行应用程序的域。这就是诀窍,问题是在生产模式下(DEBUG=False),Django 并不服务于所有域。

最近,在使用gunicorn和nginx部署Django应用程序时,我遇到了以下问题:应用程序对所有请求都返回错误请求400。解决方案很简单 - 只需将其添加到您的 settings.py 文件中即可。

表示此 Django 站点可以提供的主机/域名的字符串列表。这是一种安全措施,可防止攻击者通过提交带有虚假 HTTP 主机标头的请求来使缓存中毒并触发带有恶意主机链接的密码重置电子邮件,即使在看似安全的 Web 服务器配置下也是可能的。ALLOWED_HOSTS Django 文档- 有关更多信息的官方文档。这将适用于 Nginx 和 Apache。

Nginx 不会将 $Host 传递给您的应用程序

确保 nginx 配置配置为通过代理传递 Host 变量。这是通过将以下内容添加到位置指令来完成的:


proxy_set_header Host $host;

 
proxy_set_header X-Forwarded-Host $server_name;


配置的完整示例可能如下所示:

server {
  listen      80;
  server_name example.com;
  access_log off;

  location /static/ {
      alias /opt/projectname/static/;
  }

  location / {
      proxy_set_header Host $host;
      proxy_pass http://localhost:8000;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header X-Real-IP $remote_addr;
  }
}

主机名有下划线

尽管域名实际上可以包含下划线, 但主机名不能。因此,即使您正确设置了 ALLOWED_HOSTS,Django 也不会验证它。这是 Django 实际用来验证主机名的正则表达式:


host_validation_re = re.compile(r"^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9:]+\])(:\d+)?$")

如您所见,没有下划线的空间。在这种情况下,您应该考虑更改主机名或修补 Django 的验证功能。特别是,将 host_validation_re 更改为与您的主机名匹配的那个。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。