如何使用机架中间件从http请求中检测手机

时间:2014-03-13 18:37:07

标签: ruby-on-rails regex mobile http-headers rack

我有一个rails应用程序,我正在使用rack-mobile-detect为手机提供不同的响应。现在我正在尝试缓存这些响应,问题是rack-mobile-detect标签平板电脑和手机,所以我无法键入rack-mobile-detect标头。在我看来,最好的办法是修改rack-mobile-detect,以便它只检测手机,但我无法搞清楚。如果没有普通的浏览器标记为手机,那么只要一些不起眼的手机可以通过,这就不一定是100%了。以下是相关代码:

def initialize(app, options = {})
  @app = app
  @regex_ua_targeted = options[:targeted] || /iphone|android|ipod|ipad/i
  @regex_accept = /vnd\.wap/i
  @regex_ua_catchall = options[:catchall] ||
    Regexp.new('palm|blackberry|nokia|phone|midp|mobi|symbian|chtml|ericsson|minimo|' +
        'audiovox|motorola|samsung|telit|upg1|windows ce|ucweb|astel|plucker|' +
        'x320|x240|j2me|sgh|portable|sprint|docomo|kddi|softbank|android|mmp|' +
        'pdxgw|netfront|xiino|vodafone|portalmmm|sagem|mot-|sie-|ipod|up\\.b|' +
        'webos|amoi|novarra|cdm|alcatel|pocket|ipad|iphone|mobileexplorer|' +
        'mobile', true)
end

def call(env)
  device = nil
  user_agent = env.fetch('HTTP_USER_AGENT', '')
  device = Regexp.new(@regex_ua_targeted).match(user_agent)
  device ||= env.keys.detect { |k| k.match(/^HTTP(.*)_PROFILE$/) } != nil
  device ||= Regexp.new(@regex_accept).match(env.fetch('HTTP_ACCEPT','')) != nil
  device ||= Regexp.new(@regex_ua_catchall).match(user_agent) != nil
  if device
    device = device.to_s
    env[X_HEADER] = device
  end
  @app.call(env)
end

所以我的问题是:修改此内容的最佳方法是什么才能检测到手机而不是平板电脑?有谁知道一个有效的正则表达式?非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

有一颗宝石可能对https://github.com/talison/rack-mobile-detect有所帮助 另外我建议考虑这个gem github.com/jistr/mobvious,因为它检测设备类型(移动设备,平板电脑,桌面)