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

网友投稿 729 2022-05-29

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 实际用来验证主机名的正则表达式:

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

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

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

Django Nginx

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Redis学习(6)
下一篇:沙拉翻译网页双语显示,程序员必备,是神器没错了
相关文章