django nginx 在生产中通过 http 获取 csrf 验证错误

Posted

技术标签:

【中文标题】django nginx 在生产中通过 http 获取 csrf 验证错误【英文标题】:django nginx getting csrf verification error in production over http 【发布时间】:2017-10-17 12:11:31 【问题描述】:

我刚刚使用 nginx 在 AWS 上部署了我的 django 项目。一切正常,除了当我尝试发出任何 POST 请求(仅通过 http)时,我收到错误:

"禁止 (403) CSRF 验证失败。请求中止。”

如果我直接使用 Django 运行我的服务器,CSRF 验证会起作用,这让我认为我没有正确设置我的 nginx.conf。 有人可以就我如何配置 nginx 以使用 csrf 提供一些指导吗? 这是我当前的配置:

#nginx.conf
upstream django 
    # connect to this socket
    server unix:///tmp/uwsgi.sock;    # for a file socket
    #server 127.0.0.1:8001;      # for a web port socket
    
server 
    # the port your site will be served on
    listen 80;

    root /opt/apps/site-env/site;

    # the domain name it will serve for
    server_name mysite.org

    charset     utf-8;

    #Max upload size
    client_max_body_size 75M;   # adjust to taste

    location /media  
            alias /opt/apps/site-env/site/media; 
    

    location /static 
            alias /opt/apps/site-env/site/static;     
    

    location / 
    uwsgi_pass  django;

    include     /etc/nginx/uwsgi_params; 

    proxy_pass_header X-CSRFToken;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto http;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header HOST $http_host;
    proxy_set_header X-NginX-Proxy true;


    

    

我还在 django 设置中同时关闭了 SESSION_COOKIE_SECURECSRF_COOKIE_SECURE

谢谢

【问题讨论】:

我在我的配置中使用 $http 而不是 $http_host 和 ***.com/a/15414811/808236 说 $http_host 也可能是空的。所以尝试切换到 $host 并检查。 @iamkhush 似乎不起作用 【参考方案1】:

当您从 javascript 发布帖子时,请确保将 settings.CSRF_COOKIE_HTTPONLY 设置为 False

来自 [1] 的片段:“是否在 CSRF cookie 上使用 HttpOnly 标志。如果设置为 True, 客户端 JavaScript 将无法访问 CSRF cookie。”

[1]https://docs.djangoproject.com/en/2.0/ref/settings/#csrf-cookie-httponly

【讨论】:

以上是关于django nginx 在生产中通过 http 获取 csrf 验证错误的主要内容,如果未能解决你的问题,请参考以下文章

Django + Uwsgi + Nginx 实现生产环境部署

Django + Uwsgi + Nginx 实现生产环境部署

Django + Uwsgi + Nginx 的生产环境部署

mysql + Python3.5.2 + Django + Uwsgi + Nginx实现生产环境

Django1.11+Uwsgi+Nginx的生产环境部署

Nginx+uWsgi生产部署Django