赞
踩
深入理解nginx realip模块[上]
深入理解nginx realip模块[下]
{
ngx_string("set_real_ip_from"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
ngx_http_realip_from,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
在以上配置指定引用的回调函数ngx_http_realip_from中,会将解析到的受信任的proxy地址存储到 rlcf->from数组里面。譬如以下代码:
if (ngx_strcmp(value[1].data, "unix:") == 0) {
cidr = ngx_array_push(rlcf->from);
if (cidr == NULL) {
return NGX_CONF_ERROR;
}
cidr->family = AF_UNIX;
return NGX_CONF_OK;
}
将在解析到unix:的时候,会在数组里面添加一个family类型为 AF_UNIX的条目。
对于IP/MASK表示的CDIR,则会解析cdir(同时支持ipv4和ipv6类型的地址)。
对于域名,则nginx会调用ngx_inet_resolve_host来解析域名,需要注意的是,这个解析域名的操作是同步请求,如果解析域名的操作比较慢,有可能导致nginx启动的时候会卡住。解析出来的若干个IP地址将逐个被添加到rlcf->from数组中。
{
ngx_string("real_ip_header"),
NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
ngx_http_realip,
NGX_HTTP_LOC_CONF_OFFSET,
0,
NULL },
在以上配置指定引用的回调函数ngx_http_realip中,会解析客户端真实IP的来源类型,包括名字叫X-Real-IP、X-Forwarded-For标准HTTP头或者是自定义HTTP头,也可以指定proxy_protocol,利用proxy_protocol协议透传过来的客户端真实IP。
源码如下:
static char * ngx_http_realip(ngx_conf_t *cf, ngx_command_t *cmd, void *conf) { ngx_http_realip_loc_conf_t *rlcf = conf; ngx_str_t *value; if (rlcf->type != NGX_CONF_UNSET_UINT) { return "is duplicate"; } value = cf->args->elts; if (ngx_strcmp(value[1].data, "X-Real-IP") == 0) { rlcf->type = NGX_HTTP_REALIP_XREALIP; return NGX_CONF_OK; } if (ngx_strcmp(value[1].data, "X-Forwarded-For") == 0) { rlcf->type = NGX_HTTP_REALIP_XFWD; return NGX_CONF_OK; } if (ngx_strcmp(value[1].data, "proxy_protocol") == 0) { rlcf->type = NGX_HTTP_REALIP_PROXY; return NGX_CONF_OK; } /* 这里预先计算在http请求头中进行查找的自定义HTTP头名字的哈希值 对于 X-Real-IP和 X-Forwarded-For头
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。