如何以编程方式在 NGINX 中查询 GeoIP

Posted

技术标签:

【中文标题】如何以编程方式在 NGINX 中查询 GeoIP【英文标题】:How to query the GeoIP in NGINX programmably 【发布时间】:2013-07-03 13:56:59 【问题描述】:

我使用参数“--with-http-geoip-module”成功编译了nginx和geoip模块。

数据库在我的 nginx.conf 文件中显示。

http
    ....
    geoip_country   /usr/lib/local/geoip.dat;
    ....

一切似乎都很好,这个模块加载没有错误。

我已将自己的模块添加到 NGINX 中。 我尝试从 geo 模块查询 geoip_country_code 变量。

static ngx_int_t
ngx_http_cms_url_handler(ngx_http_request_t *r)

    ngx_str_t variable_name = ngx_string("geoip_country_code");

    ngx_http_variable_value_t * geoip_country_code_var = ngx_http_get_variable( r, &variable_name, 0);
    ngx_log_debug( NGX_LOG_INFO, r->connection->log, 0, "ngx_http_get_variable[%d]", geoip_country_code_var->not_found);


not_found始终为1,无法获取位置信息。

有谁知道问题出在哪里?

【问题讨论】:

【参考方案1】:

我错了,ngx_http_get_variable 的第三个参数(哈希)不是可选的,即使第二个参数中指定了变量名。

static unsigned
get_ip_country(ngx_http_request_t *r, ngx_str_t *geoip_country_code)
    ngx_str_t variable_name = ngx_string("geoip_country_code");

    ngx_int_t hash = ngx_hash_key (variable_name.data, variable_name.len);

    ngx_http_variable_value_t * geoip_country_code_var = ngx_http_get_variable( r, &variable_name, hash);
    if( geoip_country_code_var && !geoip_country_code_var->not_found && geoip_country_code_var->valid)
        geoip_country_code->data = ngx_palloc( r->pool, geoip_country_code_var->len);
        geoip_country_code->len = geoip_country_code_var->len;


        ngx_strlow( geoip_country_code->data, geoip_country_code_var->data, geoip_country_code->len);
        return 1;
    
    return 0;

【讨论】:

以上是关于如何以编程方式在 NGINX 中查询 GeoIP的主要内容,如果未能解决你的问题,请参考以下文章

如何授予对 nGinx 中 GeoIP [国家] 阻止的特定 IP 地址的访问权限?

如何在生产环境中运行的 Nginx 上安装 Geoip2 模块?

如何以编程方式即时管理 iptables 规则?

使用 nginx 运行 geoip 模块

如何在 Django 上使用 GeoIP 在 ASN 中查询已知 IP 地址?

nginx geoip city 如何只使用英文字符?