Project

Общее

Профиль

Настройка CORS на бэкенде (Nginx + Django) для возможности разработки фронтенда на localhost

Цель - возможность разработки фронтенда на localhost при нахождении api бэкенда на удалённом сервере. При работе с сессией на бэкенде - должна устанавливаться кука сессии sessionid.

Параметры nginx

        location ^~ /static {
            alias /path/static;
            add_header Access-Control-Allow-Origin $http_origin;
        }

        location ^~ /media {
            alias /path/media;
            add_header Access-Control-Allow-Origin $http_origin;
        }

        location / {
            proxy_pass http://127.0.0.1:8000;

            proxy_set_header Host $host;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Origin $http_origin;
            proxy_set_header Access-Control-Allow-Origin $http_origin;
            proxy_set_header Access-Control-Allow-Credentials 'true';
            proxy_set_header Access-Control-Allow-Headers 'Accept,Authorization,Cache-Control,Content-Type,DNT,If-Modified-Since,Keep-Alive,Origin,User-Agent,X-Requested-With,Set-Cookie';
        }


Настройки Django

SITE_DOMAIN - site.com
API_DOMAIN - api.site.com или apisite.com
LOCAL - признак локальной разработки. Нужен для того, чтобы локально открывалась админпанель (возможны другие реализации, здесь для иллюстрации, на какие параметры обратить внимание).


LOCAL = os.environ.get("LOCAL", False)

CORS_ALLOWED_ORIGINS = [
    f"https://{SITE_DOMAIN}",
    f"https://{API_DOMAIN}",
]
CORS_TRUSTED_ORIGINS = [
    SITE_DOMAIN,
    API_DOMAIN,
]
if DEBUG:
    CORS_TRUSTED_ORIGINS += [
        "localhost:8080",
        "localhost",
    ]
    CORS_ALLOWED_ORIGINS += [
        "http://localhost:8080",
    ]


CORS_ALLOW_CREDENTIALS = True
CORS_REPLACE_HTTPS_REFERER = True

SESSION_COOKIE_SAMESITE = "None"
SESSION_COOKIE_HTTPONLY = True
if not LOCAL:
    SESSION_COOKIE_DOMAIN = API_DOMAIN
    SESSION_COOKIE_SECURE = True

CSRF_COOKIE_SECURE = True