nginx subrequest的一个坑

自己写了一个subrequest模块,通过反向代理将子请求打向后端。

问题是当我发POST请求给nginx时,subrequest总是向后端发GET请求,于是我看了一下源码,在src/http/ngx_http_core_module.c中,原来ngx_http_subrequest方法中定义子请求是这样子的:

sr->method = NGX_HTTP_GET;
sr->method_name = ngx_http_core_get_method;
果断改成继承父请求,于是改成这样子:
sr->method = r->method;
sr->method_name = r->method_name;

改完之后,subrequest确实发POST请求了,但是却core掉了,于是gdb了一下,发现在ngx_http_read_client_request_body方法中,请求的header_in指向0(header_in指向nginx收到的未经解析的HTTP头部),要在地址0拿数据肯定core掉。读请求体已经是进入到反向代理的模块中了,所以说该请求是子请求,说明子请求并没有从父请求中继承header_in成员,于是,在刚才的方法中又加了一句:

sr->header_in = r->header_in;

完成后,没有再core掉。大功告成!


疑问是为什么nginx要这样设计呢,将GET请求写死在代码中,资料很少,只能在今后多注意一下。

你可能感兴趣的:(nginx subrequest的一个坑)