从Django 2更新到Django 4.0.1后,我在所有POST请求中都收到了CSRF错误。日志显示:
"警告:django.security.csrf:禁止(来源检查失败-https://127.0.0.1与任何可信来源不匹配。(:/激活/";
我不知道如何为CSRF_TRUSTED_ORIGINS设置通配符?我有一台服务器运送给在自己的域上托管它的客户,所以我不可能事先没有来源。我尝试了以下没有运气:
CSRF_TRUSTED_ORIGINS = ["https://*", "http://*"]
和
CSRF_TRUSTED_ORIGINS = ["*"]
显式设置";https://127.0.0.1"在CSRF_TRUSTED_ORIGINS中工作,但在我的客户的生产部署中不工作,这将获得另一个主机名。
https://github.com/django/django/blob/3ff7f6cf07a722635d690785c31ac89484134bee/django/middleware/csrf.py#L276
我通过在Django中添加以下内容解决了这个问题:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
并确保NGINX在我的NGINX conf中使用以下内容转发http方案:
proxy_set_header X-Forwarded-Proto $scheme;
是的,它在4.0版本中发生了变化,正如你在这里看到的
Django 4.0中的更改:
旧版本中的值必须仅包括主机名(可能带有前导点(,而不是scheme或星号
此外,原始标头检查在旧版本中不执行。
注意:您不应该在生产中使用*
。