Django Admin - CSRF 验证失败。请求中止

标签 django nginx

每当我尝试登录 Django 的管理应用程序时,在填写用户名和密码并提交表单后,页面永远挂起。

当我在浏览器中刷新 POST 请求时,我得到:

CSRF verification failed. Request aborted.

enter image description here

当我再次刷新页面时,一切正常,我看到管理应用程序,我已登录,我可以在我的应用程序和表上执行 CRUD 操作。

任何想法为什么?

我在 Django 应用程序前面有 Nginx 反向代理进行 https 握手。所以当你去(例子)时:
https://platform.staging.com/admin/

Nginx 反向代理到
http://admin1.staging.platform.com/admin/

这是我的 nginx 配置:
upstream admin-cluster {
  ip_hash;
  server admin1.staging.platform.com;
}

# force redirect of http to https
# application will be available only over https
server {
  listen 80 default;
  server_name platform.staging.com;
  rewrite     ^ https://$server_name$request_uri? permanent;
}

# https server
# traffic is going to local web servers over normal http
# front nginx proxy server will hold ssl session
server {
  listen 443 ssl spdy;
  server_name platform.staging.com;
  keepalive_timeout 70;

  ssl                 on;
  ssl_certificate     /etc/ssl/platform.staging.com.crt;
  ssl_certificate_key /etc/ssl/platform.staging.com.key;

  location /admin {
    proxy_pass http://admin-cluster;
  }

}

编辑:

所以,我找到了一个解决方法。当我在 Nginx 反向代理上也允许端口 80 但将所有 http 请求重定向到 https 时,如下所示:
server {
  listen 80 default;
  server_name platform.staging.com;
  rewrite     ^ https://$server_name$request_uri? permanent;
}

它解决了这个问题。知道为什么吗?

最佳答案

检查覆盖 SESSION_COOKIE_SECURE 的值的设置和 CSRF_COOKIE_SECURE值,因为问题可能与 CSRF cookie 有关。 编辑 : 事实上,我已经将这两个值设置为 True。

另外,请检查您的 SECURE_PROXY_SSL_HEADER 设置,虽然我不确定它与您的问题有关。我在您的 nginx conf 文件中缺少一个 proxy_set_header X-Forwarded-Protocol 指令,用于让 Django 知道您正在通过代理。

关于Django Admin - CSRF 验证失败。请求中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21135103/

相关文章:

docker - 如何彻底阻止容器重启 Kubernetes

Django 迁移更改字段类型

django - 嵌套查询过滤器_Django

django - 如何在 Django 管理中的 TabularInline 表单集中设置默认值

python - Django:如何在不使用默认管理员的情况下管理组和权限

python - Django CharField 限制

linux - 如何从 ubuntu 13.04 中完全删除 nginx?

docker - 如何通过代理访问Nginx Docker容器?

nginx - 如何从 SEO 的角度从 HTTP/1.1 迁移到 HTTP/2?

nginx - 有没有办法在没有任何第三方实用程序的情况下在 nginx 中创建一个简单的静态图片库?