Realip: fixed duplicate processing on redirects (ticket #1098).

Duplicate processing was possible if the address set by realip was
listed in set_realip_from, and there was an internal redirect so module
context was cleared.  This resulted in exactly the same address being set,
so this wasn't a problem before the $realip_remote_addr variable was
introduced, though now results in incorrect $realip_remote_addr being
picked.

Fix is to use ngx_http_realip_get_module_ctx() to look up module context
even if it was cleared.  Additionally, the order of checks was switched to
check the configuration first as it looks more effective.
This commit is contained in:
Maxim Dounin 2016-10-06 23:16:05 +03:00
parent 88dc647481
commit 52892835ef

View File

@ -141,18 +141,18 @@ ngx_http_realip_handler(ngx_http_request_t *r)
ngx_http_realip_ctx_t *ctx; ngx_http_realip_ctx_t *ctx;
ngx_http_realip_loc_conf_t *rlcf; ngx_http_realip_loc_conf_t *rlcf;
ctx = ngx_http_get_module_ctx(r, ngx_http_realip_module);
if (ctx) {
return NGX_DECLINED;
}
rlcf = ngx_http_get_module_loc_conf(r, ngx_http_realip_module); rlcf = ngx_http_get_module_loc_conf(r, ngx_http_realip_module);
if (rlcf->from == NULL) { if (rlcf->from == NULL) {
return NGX_DECLINED; return NGX_DECLINED;
} }
ctx = ngx_http_realip_get_module_ctx(r);
if (ctx) {
return NGX_DECLINED;
}
switch (rlcf->type) { switch (rlcf->type) {
case NGX_HTTP_REALIP_XREALIP: case NGX_HTTP_REALIP_XREALIP: