如何在 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 与此处的主机不匹配:
我通过在 Django 中添加以下内容解决了这个问题:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
并确保 NGINX 在我的 NGINX conf 中使用以下内容转发 http 方案:
proxy_set_header X-Forwarded-Proto $scheme;
从 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 与此处的主机不匹配:
我通过在 Django 中添加以下内容解决了这个问题:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
并确保 NGINX 在我的 NGINX conf 中使用以下内容转发 http 方案:
proxy_set_header X-Forwarded-Proto $scheme;