如何检测请求是否来自移动设备

How to detect if request came from mobile device

在服务器端有什么方法可以检测到 API 的特定请求来自移动设备(来自移动应用程序)? 我知道用户代理嗅探,但我不喜欢这种方法,因为没有足够的理由不实施它。 我也知道当它来自我的移动应用程序时我可以添加一些标志来请求,但这似乎也有点脏。 实际上有 'proper' 方法吗?

我想变化不大,但我的后端在 node.js。

您好,谢谢! 汤姆

一般的答案是否定的。您从设备收到一条 header / 消息。您对设备的所有了解都在 header 中,并且设备可以在其中写入它想要的内容。如果您谈论的是 http 请求(由代理查找指示),您可以在此处查看 header:

您"reliable"所能做的就是寻找用户代理。在我的例子中,它是 Linux 上的 Mozilla Firefox。但如果我愿意,我可以伪造它。

Host: somesite.org
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:34.0) Gecko/20100101 Firefox/34.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://somesite.org/index.php?page=2
Cookie: rteStatus=rte; 
Cache-Control: max-age=0

如果是某个 chromium-mobile 站点,也许您可​​以从 referer 那里获得一些信息,或者您可以查看 Accept 和 Accept-Enconding,也许某些移动浏览器接受不同的东西。但是没有可靠的方法来确定设备,而是通过其用户代理通过 header.

另一种方法是查看请求是否来自称为 3G 或 4G 池的 IP。但如果请求不是通过 WLAN / WIFI 发出,这只会起作用。而且我不确定是否存在3G / 4G IP地址池列表。

您可以使用UserAgent字符串进行检测。下面是 C# 中的代码。

 public bool IsMobileDevice(HttpRequest r){
                    String userAgetnt = r.UserAgent;
                    String deviceName = "Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini";
                    return Regex.IsMatch (r.UserAgent, deviceName);
                }