如何在 Django 中为 CSRF_TRUSTED_ORIGINS 设置通配符?

How do I set a wildcard for CSRF_TRUSTED_ORIGINS in Django?

从 Django 2 更新到 Django 4.0.1 后,我在所有 POST 请求中收到 CSRF 错误。日志显示:

"警告:django.security.csrf:禁止(来源检查失败 - https://127.0.0.1 不匹配任何受信任的来源。):/activate/"

我不知道如何为 CSRF_TRUSTED_ORIGINS 设置通配符?我有一台服务器运送给客户,客户在他们自己的域上托管它,所以我无法事先知道来源。我尝试了以下方法但没有成功:

CSRF_TRUSTED_ORIGINS = ["https://*", "http://*"]

CSRF_TRUSTED_ORIGINS = ["*"]

在 CSRF_TRUSTED_ORIGINS 中明确设置“https://127.0.0.1”有效,但在我客户的生产部署中不起作用,它将获得另一个主机名。

是的,它在 4.0 版本中发生了变化,如您所见here

Changed in Django 4.0:

The values in older versions must only include the hostname (possibly with a leading dot) and not the scheme or an asterisk.

Also, Origin header checking isn’t performed in older versions.

注意:您不应该在生产中使用 *

Django 应用 运行 在 NGINX 后面使用 Gunicorn。因为 SSL 在 NGINX request.is_secure() returns false 之后终止,导致 Origin header 与此处的主机不匹配:

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;