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

Ami*_*mix 10 python django csrf

从 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://*"]
Run Code Online (Sandbox Code Playgroud)

CSRF_TRUSTED_ORIGINS = ["*"]
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*mix 5

Django 应用程序在 NGINX 后面使用 Gunicorn 运行。因为 SSL 在 NGINX request.is_secure() 返回 false 后终止,这会导致 Origin 标头与此处的主机不匹配:

https://github.com/django/django/blob/3ff7f6cf07a722635d690785c31ac89484134bee/django/middleware/csrf.py#L276

我通过在 Django 中添加以下内容解决了该问题:

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
Run Code Online (Sandbox Code Playgroud)

并确保 NGINX 在我的 NGINX conf 中使用以下内容转发 http 方案:

proxy_set_header X-Forwarded-Proto $scheme;
Run Code Online (Sandbox Code Playgroud)