diff options
author | Dmitry Volyntsev <xeioex@nginx.com> | 2016-05-23 18:44:22 +0300 |
---|---|---|
committer | Dmitry Volyntsev <xeioex@nginx.com> | 2016-05-23 18:44:22 +0300 |
commit | 19140c8c4f7f16747df4a7e3bf4299a6a8d75a81 (patch) | |
tree | 44aaec7ea173a583a49d176ddb31863d39edcefb | |
parent | 97495b662f378bad2a9df05d4c4b4e0977b1d309 (diff) | |
download | nginx-19140c8c4f7f16747df4a7e3bf4299a6a8d75a81.tar.gz nginx-19140c8c4f7f16747df4a7e3bf4299a6a8d75a81.zip |
Realip: take client port from PROXY protocol header.
Previously, when the client address was changed to the one from
the PROXY protocol header, the client port ($remote_port) was
reset to zero. Now the client port is also changed to the one
from the PROXY protocol header.
-rw-r--r-- | src/http/modules/ngx_http_realip_module.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/http/modules/ngx_http_realip_module.c b/src/http/modules/ngx_http_realip_module.c index 5a6e4ad1d..cfaa4c978 100644 --- a/src/http/modules/ngx_http_realip_module.c +++ b/src/http/modules/ngx_http_realip_module.c @@ -138,6 +138,10 @@ ngx_http_realip_handler(ngx_http_request_t *r) ngx_list_part_t *part; ngx_table_elt_t *header; ngx_connection_t *c; + struct sockaddr_in *sin; +#if (NGX_HAVE_INET6) + struct sockaddr_in6 *sin6; +#endif ngx_http_realip_ctx_t *ctx; ngx_http_realip_loc_conf_t *rlcf; @@ -237,6 +241,24 @@ found: rlcf->recursive) != NGX_DECLINED) { + if (rlcf->type == NGX_HTTP_REALIP_PROXY) { + + switch (addr.sockaddr->sa_family) { + +#if (NGX_HAVE_INET6) + case AF_INET6: + sin6 = (struct sockaddr_in6 *) addr.sockaddr; + sin6->sin6_port = htons(c->proxy_protocol_port); + break; +#endif + + default: /* AF_INET */ + sin = (struct sockaddr_in *) addr.sockaddr; + sin->sin_port = htons(c->proxy_protocol_port); + break; + } + } + return ngx_http_realip_set_addr(r, &addr); } |