Ошибка проверки токена CSRF в админке django с использованием SSL, nginx

У меня ошибка csrf token при попытке войти в админку django в продакшене после добавления SSL.

Если я использую приведенную ниже конфигурацию без ssl, все работает нормально:

upstream app_server {
    server unix:/home/app/run/gunicorn.sock fail_timeout=0;
}

server {
    listen 80;

    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    server_name 107.***.28.***;

    keepalive_timeout 5;
    client_max_body_size 4G;

    access_log /home/app/logs/nginx-access.log;
    error_log /home/app/logs/nginx-error.log;

    location /static/ {
        alias /home/app/static/;
    }

    # checks for static file, if not found proxy to app
    location / {
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }
}

Но если я перехожу на конфигурацию do listen SSL при заполнении любой формы на странице я получаю ошибку csrf_token. Моя конфигурация nginx, использующая SSL:

upstream app_server {
    server unix:/home/app/run/gunicorn.sock fail_timeout=0;
}

server {
    #listen 80;

    # add here the ip address of your server
    # or a domain pointing to that ip (like example.com or www.example.com)
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    keepalive_timeout 5;
    client_max_body_size 4G;

    access_log /home/app/logs/nginx-access.log;
    error_log /home/app/logs/nginx-error.log;

    # Compression config
    gzip on;
    gzip_min_length 1000;
    gzip_buffers 4 32k;
    gzip_proxied any;
    gzip_types text/plain application/javascript application/x-javascript text/javascript text/xml text/css;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";

    location /static/ {
        alias /home/app/static/;
    }

    # checks for static file, if not found proxy to app
    location / {
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }
}

server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

server {
    listen 80;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl;
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

Как я могу исправить ошибку или где найти ошибку. Я пробовал очищать куки, использовать разные браузеры, перезагружать сервер и конфигурацию сервера безрезультатно.

В Django ≥ 4 теперь необходимо указать CSRF_TRUSTED_ORIGINS в settings.py

CSRF_TRUSTED_ORIGINS = [
    'https://your-domain.com'',
    'https://www.your-domain.com'
]

Смотрите документацию

Вернуться на верх