NGINX GeoIP 和在服务器级别检测移动设备

Posted

技术标签:

【中文标题】NGINX GeoIP 和在服务器级别检测移动设备【英文标题】:NGINX GeoIP and detecting mobile at server level 【发布时间】:2013-04-24 19:20:47 【问题描述】:

我想要做的是设置 nginx 来检测特定的国家代码。我现在可以正常工作,添加诸如 if ($geoip_country_code = IE) rewrite ^(.*) @987654321@; 这是在我的实际站点配置文件中,而不是在我的 nginx.conf 文件中。

我还想做的是为此添加移动检查,例如,如果它是爱尔兰和移动,它将转到第二个链接。这甚至可以在这个级别上做到吗?还是我只是在服务器级别检测国家/地区,然后必须以更标准的方式处理移动设备,例如在页面加载和使用移动设备检测脚本时。我知道我可以这样做,但我希望能够将检测添加到我的 NGINX 配置中的相同捕获中。

感谢所有帮助和信息。

【问题讨论】:

【参考方案1】:

看看http://detectmobilebrowsers.com。它有用于 nginx 的代码 sn-p。 最近我做了这样的nginx配置,效果很好。

【讨论】:

【参考方案2】:

由于移动用户代理的惊人差异,使用代码重定向比使用 nginx 配置要好得多。特别是,在 nginx 上调用一系列 if 语句的成本是不小的。

This website 有一个非详尽的移动用户代理列表,旧的和不太旧的。至少可以说,您很快就会发现该列表实际上非常庞大。现在让我们只关注 iPhone、iPod 和 iPad。它们很容易区分:

Mozilla/5.0(设备类型cpu类型;CPU如Mac OS X;en)AppleWebKit/420+(Khtml,如Gecko)版本/3.0 Mobile/ 1A543a Safari/419.3

所以,这个不会造成问题。但是,该字符串与其他东西非常相似,包括 Safari 的桌面用户代理……这适用于最简单的手机。 android 没有这种简单性。以 HTC Desire 为例:

Mozilla/5.0 (Linux; U; Android 2.1-update1; de-de; HTC Desire 1.19.161.5 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17

操作系统的标识符更改为第三个字段,这意味着您现在需要至少两次正则表达式引擎调用来匹配 iPhone 和一些 android。我说一些,因为......好吧,让我们去摩托罗拉机器人:

MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0

...哇?

结论:如果您关心误报,您将需要一个用户代理数据库。如果不这样做,只需在用户代理上使用正则表达式对 nginx 进行广泛检查,搜索关键字 iPad、iPhone、iPod、Android、Windows Phone。这将标记大约 80-85% 的所有移动用户。如果您想匹配每个人,您需要使用用户代理数据库,因为制造商会重新编写他们的用户代理。

【讨论】:

非常感谢您对我这样做的问题做出如此详细的回应。我想我最好弄清楚如何在我的实际网站代码与配置中结合对我传递变量以设置目标链接的国家/地区的检查。 Country 在 nginx 中很好 - 它的计算成本并不高。这是您想要在代码中执行的用户代理部分,因为它非常复杂。

以上是关于NGINX GeoIP 和在服务器级别检测移动设备的主要内容,如果未能解决你的问题,请参考以下文章

Django 无法检测到来自 nginx 的 GeoIP 数据

移动漫游的 GeoIP 服务的可靠性如何?

nginx 和 PHP GeoIP 模块的内部错误 500

nginx GeoIP 缓存密钥

Nginx的GeoIp模块的应用与使用

./configure: error: the GeoIP module requires the GeoIP library.