我将 Nginx 设置为 uWSGI 应用程序(Django 应用程序)的反向代理。由于 Django 应用程序托管的内容的性质,有时 URL 会变长。真长。因此,Referer
HTTP 标头有时也会变长。
这就是问题所在。Referer
如果 Nginx 超过 1128 字节(通过反复试验发现),Nginx 会丢弃从客户端接收到的数据。任何 1128 字节或更小的内容都会传递到上游服务器。所有更大的东西都会被丢弃。这是一个问题,因为 Django 的 CSRF 保护机制需要一个完整的Referer
.
这是我的 Nginx 配置的相关部分。文件:
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header Referer $http_referer;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
我查看了 Nginx 文档,找不到控制客户端标头最大长度的设置。沮丧的是,我什至开始翻阅 Nginx 的源代码,但也没有用。
我需要做什么才能让 NginxReferer
未经修改地传递给上游服务器?
版本信息
- Ubuntu 14.04 服务器 64 位
- nginx/1.4.6 (Ubuntu)
- uWSGI 1.9.17.1-debian
- Django 1.7.0
Xavier 的回答和随后的讨论让我找到了这个问题的真正原因:uWSGI。看来 uWSGI 正在剥离标头:
解决方案非常简单——在启动 uWSGI 时,我只需要包含以下选项:
现在所有的标头都通过了 Django,并且 CSRF 验证成功。
Nginx 标头读取大小由两个指令控制:
client_header_buffer_size [buffer_size]
这是在大多数情况下适合的默认缓冲区large_client_header_buffers [count] [buffer_size]
如果它不适合缓冲区,则它们是按需分配的附加缓冲区client_header_buffer_size
。您必须根据您的情况调整最后一个指令,并确保大于buffer_size
请求中传递的任何行(标头 + 带有 HTTP 方法和 HTTP 版本的 URL)。