【发布时间】:2021-08-07 01:06:17
【问题描述】:
我正在尝试测试在开发模式下运行良好的 Django 设置的部署配置。
我通过负载平衡器上的 Nginx 的 ssl_preread 模块进行基于名称的路由,并且 SSL 终止于服务器本身的另一个 Nginx 实例,请求通过套接字代理到 uwsgi。
server {
server_name dev.domain.net;
listen 80 proxy_protocol;
listen [::]:80 proxy_protocol;
location / {
return 301 https://$host$request_uri;
}
}
server {
server_name dev.domain.net;
listen 443 ssl;
listen [::]:443 ssl;
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/website.sock;
}
location /favicon.ico {
access_log off; log_not_found off;
}
}
我已将 uwsgi 设置为记录 %(host) 和 %(referer),它们在日志中匹配。
在我的 uwsgi_params 中,我像这样传递 $host 和 $referer,因为我使用基于名称的路由,所以我选择了触发 Nginx 响应的 $server_name 变量...
uwsgi_param HTTP_REFERER $server_name;
uwsgi_param HTTP_HOST $host;
向这些添加(或删除)协议和端口没有任何区别。可以预见,将它们带走会产生 Django ALLOWED_HOSTS 调试错误。
我已确认我的ALLOWED_HOSTS 包含$host。我尝试为相同的$host 变量添加CSRF_TRUSTED_ORIGINS。我尝试将CSRF_COOKIE_DOMAIN 设置为相同的$host 变量。根据文档建议,我将 CSRF_COOKIE_SECURE 设置为 True。
无论使用上述设置的哪种组合,我都得到:
Referer checking failed - Referer is malformed. 用于所有 POST 请求。
【问题讨论】:
标签: django nginx csrf uwsgi referer