admin管理员组

文章数量:1567751

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

  ngx_http_browser_module用于从"User-Agent"请求头中获取指定变量值。

  浏览器模块 语法及语义

  ancient_browser

   语法:ancient_browser string …;

   语义:如果任一指定的子串在请求头的"User-Agent"域中被发现,浏览器将被认定为旧式浏览器。 特殊字符串"netscape4"相当于正则表达式"^Mozilla/[1-4]"。

   如果浏览器被识别为旧式浏览器,则ancient_browser等于ancient_browser_value指定的值。

  ancient_browser_value

   语法:ancient_browser_value string;

   语义:设定变量$ancient_browser的值。

  modern_browser

​   语法:modern_browser browser version;

      modern_browser unlisted;

   语义:指定一个版本,此版本及后续版本的浏览器都被认定为新式浏览器。 浏览器可以是下列之一: msie、gecko(基于Mozilla)、opera、safari或者konqueror。

   版本可被指定为以下形式:X, X.X, X.X.X, 或 X.X.X.X。 每一形式的最大值分别是4000, 4000.99, 4000.99.99, 和 4000.99.99.99。

   浏览器既没有在modern_browser中列出,又没有在ancient_browser中列出时,如果配置了特殊值unlisted,那么浏览器将被认定为新式浏览器,否则认定为旧式浏览器。 如果请求头中没有"User-Agent"域,浏览器以没有列出对待。

  modern_browser_value

   语法:modern_browser_value string;

   语义:设定变量$modern_browser的值;

  $msie

   语义:如果浏览器被识别为任何版本的MSIE,则$msie为1;

  浏览器模块 示例

  为指定的浏览器版本指定index页面:

  为演示效果,在/usr/local/nginx/html/目录下新建browser目录,在browser目录下新建index.html和index.modern.html,为做区分,两个html的内容稍有差异。

  在默认nginx.conf的基础上修改配置如下:

worker_processes  1;

error_log  logs/error.log;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  securitit;

        location / {
	    	modern_browser_value "modern.";

            modern_browser msie      5.5;
            modern_browser gecko     1.0.0;
            modern_browser opera     9.0;
            modern_browser safari    413;
            modern_browser konqueror 3.0;

	    	root /usr/local/nginx/html/browser/;

            index index.${modern_browser}html index.html;
        }

    }

}

  通过./nginx -s reload平滑重启Nginx后,访问http://192.168.20.9/,会出现如下效果,说明浏览器版本与配置匹配成功,所以访问了index.modern.html资源:

  为了看出不一样的效果,将nginx.conf的配置进行修改:

	location / {
	    	modern_browser_value "modern.";

            modern_browser msie      15.5;
            modern_browser gecko     11.0.0;
            modern_browser opera     19.0;
            modern_browser safari    1413;
            modern_browser konqueror 13.0;

	    	root /usr/local/nginx/html/browser/;

            index index.${modern_browser}html index.html;
	}

  通过./nginx -s reload平滑重启Nginx后,访问http://192.168.20.9/,会出现如下效果,说明浏览器版本与配置匹配失败,所以访问了index.html资源:

  引导旧式浏览器重定向到指定页面:

	location / {
    	modern_browser msie 5.0;

        modern_browser gecko 0.9.1;
        modern_browser opera 8.0;
        modern_browser safari 413;
        modern_browser konqueror 3.0;

        modern_browser unlisted;
        ancient_browser Links Lynx Netscape4;

        if ($ancient_browser){
          rewrite  ^  /ancient.html;
        }
	}

  浏览器之争

  从Web1.0时代开始,浏览器作为PC端互联网入口,成为了各大大小小浏览器厂商争夺用户资源的主战场,在这个过程中,诞生了多种多样的浏览器,凭借其各自的特色和优势雄踞一方。

  1994年,网景公司推出第一个图形化浏览器Netscape,微软嗅查到浏览器的重要性,收购不成主研自主浏览器IE,两者成为了第一次浏览器大战的主角,最后微软通过Windows操作系统绑定IE的方式,大败Netscape,开始了长达十年的霸主之路。败走的Netscape,成立Mozilla基金会,后期退出Firefox,Firefox凭借其多种多样的插件,仍可占有一席之地。

  2008年,Google Chrome的推出,撼动了IE的霸主地位,第二次浏览器大战到来,这其中包括Chrome、Firefox、Safari、IE、Opera。最后以Chrome的胜利结束占据,Firefox仍占有一定份额,Safari凭借苹果的优势独占一方,IE和Opera则慢慢开始了谢幕演出。

  国内市场中,出现更多的浏览器,每个人可能都能举出几个例子:360浏览器、搜狗浏览器、猎豹浏览器、QQ浏览器等等。但国内的浏览器的几乎都是改装浏览器,基于主流的浏览器内核,表面进行个性化。

  为什么要说这些,是需要了解,在Web发展的过程中,出现的各种各样的浏览器,种类繁多的浏览器为Web生态带来了致命性的问题:浏览器兼容性问题。各厂商为市场份额,极力退出个性化功能,完全无视规则约束,导致多浏览器间无法兼容。

  总结

  面对多种多样的浏览器,同一浏览器的繁杂的版本,应用程序无法适配所有的情况,需要通过应用本身进行限制,划定应用范围。

  ngx_http_browser_module可以在代理的层面,完成浏览器差异的简单处理,通过浏览器请求带有的"User-Agent"划分浏览器和版本号,并针对新旧两种浏览器类型进行相应处理。例如:

  · 指定浏览器、指定版本号,访问指定的页面资源。

  · 划定浏览器新旧界限,通过此界限限制应用支持的浏览器版本,给予友好提示。

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!

本文标签: 模块浏览器Nginxngxhttpbrowsermodule