Настройка 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