我将Nginx设置为uWSGI应用程序(Django应用程序)的反向代理。 由于Django应用托pipe的内容的性质,有时URL会变长。 真的很长。 因此, Referer HTTP头有时也会变长。
这是问题。 如果Nginx超过1128字节(通过试错发现),Nginx将丢弃从客户端接收到的Referer 。 任何1128字节或更小的内容都会传递给上游服务器。 更大的东西被丢弃。 这是一个问题,因为Django的CSRF保护机制需要一个完整的Referer 。
这是我的Nginxconfiguration的相关部分。 文件:
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注入源代码,这也没有改变任何有用的东西。
我需要做什么才能让Nginx将Referer修改地传递给上游服务器?
泽维尔的回答和随后的讨论使我认识到这个问题的真正原因:uWSGI。 看起来uWSGI正在剥离标题:
[WARNING] unable to add HTTP_REFERER
解决scheme非常简单 – 启动uWSGI时,我只需要包含以下选项:
--buffer-size 8192
所有的头文件现在通过Django,CSRFvalidation成功。
Nginx头部读取大小由两个指令控制:
client_header_buffer_size [buffer_size]这是大多数情况下适用的默认缓冲区
large_client_header_buffers [count] [buffer_size]如果不适合large_client_header_buffers [count] [buffer_size]缓冲区,它们是根据需要分配的额外缓冲区。 你必须定制最后一条指令,确保buffer_size大于请求中传递的任何行(使用HTTP方法和HTTP版本的标头+ URL)。