php循环数组输出HTML代码片段并对字符串进行base64编码
- <?php
- //公共声明
- header('Content-type: text/json');
- html_entity_decode($string, ENT_QUOTES, 'UTF-8');
- //回调参数设置
- $param="Jsoncallback";
- $callback=$_REQUEST[$param];
- $students=array(
- array("风清扬","1101","23","52819911"),
- array("许志飞","1101","23","52819911"),
- array("令狐冲","1102","21","52819901"),
- array("任我行","1103","22","52819991"),
- array("任盈盈","1104","24","52819981"),
- array("东方不败","1105","26","52819981")
- );
- $tempBegin='<style>*{margin:0;padding:0;}h1{font-size:16px;text-align:center; line-height:45px;}body{color:#333;font-size:14px;font-family:"MicrosoftYahei";background:#B7CACC;}div{border:1px solid #405E7B; border-bottom:0; width:95%; margin:0 auto;background:#fff;content:"";display:table;clear:both}li{line-height:35px;list-style:none;width:25%;text-align:center;border-bottom:1px solid #405E7B;float:left;}</style><h1>最近风云人员名单</h1><div>';
- foreach($students as $v){
- $tempBegin.='
- <ul>
- <li>'.$v[0].'</li>
- <li>'.$v[1].'</li>
- <li>'.$v[2].'</li>
- <li>'.$v[3].'</li>
- </ul>
- ';
- }
- $tempEnd=$tempBegin.'</div>';
- //echo $tempEnd;
- $str1=base64_encode($tempEnd);
- $str2='{"dataList":"'.$str1.'"}';
- $jsonStr=$callback."(".$str2.")";
- //判断请求参数存在就会输出Json数据
- //if(isset($callback)&&!empty($callback)){
- if(isset($callback)){
- echo $jsonStr;
- }
- //判断请求参数不存在就输出错误信息
- if(!isset($callback)){
- header("Content-type: text/html; charset=utf-8");
- $str="<h1>400 Required String parameter '{$param}' is not present</h1><hr /><small>http Request with error params: none callback function</small>";
- echo $str;
- }
- ?>
学习Javascript闭包(Closure)及JS闭包的深入剖析【原创】
A. 学习Javascript闭包(Closure)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
第一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
- var n=999;
- function f1(){
- alert(n);
- }
- f1(); //999
另一方面,在函数外部自然无法读取函数内的局部变量。
- function f1(){
- var n=999;
- }
- alert(n); //error
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
- function f1(){
- n=999;
- }
- f1();
- alert(n); //999
第二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
- function f1(){
- var n=999;
- function f2(){
- alert(n); // 999
- }
- }
- function f1(){
- var n=999;
- function f2(){
- alert(n);
- }
- return f2; //特别注意不要写成 return f2(); !!
- }
- var result=f1();
- result(); //999
- var b=20;
- function aa(){
- //var b=10; //如果子函数取不到就找window
- return function(){
- b++;
- console.log(b);
- }
- };
- aa()();
- function test(){
- return function(){alert("不作死就不会死!")}
- };
- test()();
- function a(){
- var i=0;
- function b(){
- console.log(++i);
- }
- return b; //返回b函数本身的内容,不能写成 return b() 这样就直接执行了
- }
- a()();
- function aa(){
- var x=10;
- (function bb(){
- x++;
- console.log(x);
- })();
- };
- console.log(aa());
- var name="The Windows";
- var soho="The Soho";
- var para="The Para";
- var vars="The Vars";
- function object(){
- this.name="My Object";
- //this.para="My Para"; //公共变量para先找this.para="My para" 如果没有定义就找window的The para
- this.soho="My Soho";
- this.getNameFunc=function(){
- //var soho="My GetNameSoho"; //先找当前定义的局部变量,如找不到就找上一层,都没有就找window 的变量
- console.log("soho2:"+soho+" this.name2:"+this.name); //soho2:My Soho this.name2:My Object
- return function(){
- this.name="My NO-NameFunc";
- console.log("this.name3:"+this.name+" this.vars3:"+this.vars); //this.name3:My NO-NameFunc this.vars3:The Vars
- return this.name; //My NO-NameFunc
- };
- }
- console.log("name1:"+name+" this.name1:"+this.name+" para:"+para); //name1:My Object this.name1:My Object para:The Para
- return getNameFunc;
- }
- //alert(object()()());
- console.log(object()()());
- <!doctype html>
- <html>
- <head>
- <meta charset="utf-8">
- <link rel="dns-prefetch" href="//hd.youyuan.com">
- <link rel="dns-prefetch" href="//x.youyuan.com">
- <link rel="dns-prefetch" href="//f1.youyuan.com">
- <link rel="dns-prefetch" href="//f2.youyuan.com">
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
- <meta content="yes" name="apple-mobile-web-app-capable" />
- <meta content="black" name="apple-mobile-web-app-status-bar-style" />
- <meta content="telephone=no" name="format-detection" />
- <title>抽奖结果</title>
- <link href="css/love-qixi.css" rel="stylesheet" type="text/css" />
- <style>
- .ele{ background:url(images/selected.png); display:none}
- .lotteryBox{ width:96%; margin:0 auto;}
- .lotteryBox .lottery{ width:290px; height:290px; margin:0 auto; background:url(images/lottery.png) no-repeat; background-size:100%; position:relative; z-index:101;}
- .lotteryBox .lottery .prize_{ width:25%; height:25%; position:absolute; z-index:102;}
- .lotteryBox .lottery .prize_1{ left:0; top:0;}
- .lotteryBox .lottery .prize_2{ left:25%; top:0;}
- .lotteryBox .lottery .prize_3{ left:50%; top:0;}
- .lotteryBox .lottery .prize_4{ left:75%; top:0;}
- .lotteryBox .lottery .prize_5{ left:75%; top:25%;}
- .lotteryBox .lottery .prize_6{ left:75%; top:50%;}
- .lotteryBox .lottery .prize_7{ left:75%; top:75%;}
- .lotteryBox .lottery .prize_8{ left:50%; top:75%;}
- .lotteryBox .lottery .prize_9{ left:25%; top:75%;}
- .lotteryBox .lottery .prize_10{ left:0%; top:75%;}
- .lotteryBox .lottery .prize_11{ left:0%; top:50%;}
- .lotteryBox .lottery .prize_12{ left:0%; top:25%;}
- .lotteryBox .lottery .selected{ background-image:url(images/selected.png); background-repeat: no-repeat; background-size:90%;}
- .lotteryBox .lottery .prize_1.selected{ background-position: 20% 30%;}
- .lotteryBox .lottery .prize_2.selected{ background-position: 36% 30%;}
- .lotteryBox .lottery .prize_3.selected{ background-position: 40% 30%;}
- .lotteryBox .lottery .prize_4.selected{ background-position: 60% 30%;}
- .lotteryBox .lottery .prize_5.selected{ background-position: 60% 35%;}
- .lotteryBox .lottery .prize_6.selected{ background-position: 60% 35%;}
- .lotteryBox .lottery .prize_7.selected{ background-position: 60% 50%;}
- .lotteryBox .lottery .prize_8.selected{ background-position: 60% 50%;}
- .lotteryBox .lottery .prize_9.selected{ background-position: 36% 50%;}
- .lotteryBox .lottery .prize_10.selected{ background-position: 20% 50%;}
- .lotteryBox .lottery .prize_11.selected{ background-position: 20% 35%;}
- .lotteryBox .lottery .prize_12.selected{ background-position: 20% 35%;}
- </style>
- </head>
- <body>
- <div class="top_blank"></div>
- <nav class="nav">
- <h2 class="pink">抽奖结果</h2>
- <div class="left" onClick="history.go(-1)"> <i class="le_trg"></i></div>
- <div class="right"><!-- <span id="search_sure" class="seach_sure">确定</span>--> </div>
- </nav>
- <div class="ele"></div>
- <div class="blank10"></div>
- <div class="lotteryBox">
- <div class="lottery">
- <div class="prize_ prize_1"></div>
- <div class="prize_ prize_2"></div>
- <div class="prize_ prize_3"></div>
- <div class="prize_ prize_4"></div>
- <div class="prize_ prize_5"></div>
- <div class="prize_ prize_6"></div>
- <div class="prize_ prize_7"></div>
- <div class="prize_ prize_8"></div>
- <div class="prize_ prize_9"></div>
- <div class="prize_ prize_10"></div>
- <div class="prize_ prize_11"></div>
- <div class="prize_ prize_12"></div>
- </div>
- <div class="blank10"></div>
- <div class="upload-btn send-out start_" usable="false">开始抽奖</div>
- </div><!-- lotteryBox -->
- </body>
- <script type="text/javascript" src="//f1.youyuan.com/xfile/www/js/??public/lib/zepto/zepto-1.1.6.js,public/m/ajax-min.js"></script>
- <script type="text/javascript" src="js/all.js"></script>
- <script type="text/javascript">
- var lottery={
- beginning:-1, //从哪个位置【起点】
- prizeNum:-1, //到哪个位置【终点】
- countNum:0, //循环DOM总共有多少个
- bufferNum:60, //转动基本次数:至少转动60次之后才可以停顿
- timer:0, //setTimeout的ID,用clearTimeout清除
- speed:20, //循环DOM转动的速度
- times:0, //向前走过的个数每次+1
- shared:0,
- cNum:0,
- beginFun:function(){
- lottery.times+=1;
- var NTT=lottery.times;
- var datanum=lottery.times;
- var dataccc=Math.ceil(datanum/2)-1;
- if(datanum%2==0){
- $(".game_").addClass("game_on");
- }
- else if(datanum%2!=0){
- $(".game_").removeClass("game_on");
- }
- lottery.rollFun();
- if (lottery.times>lottery.bufferNum&&lottery.prizeNum==lottery.beginning){
- if(lottery.prizeNum==0){
- //alert("恭喜您,中了第5个奖品")
- }else if(lottery.prizeNum==1){
- //alert("恭喜您,中了第5个奖品")
- }else if(lottery.prizeNum==2){
- //alert("恭喜您,中了第5个奖品")
- }else if(lottery.prizeNum==3){
- //alert("恭喜您,中了第5个奖品")
- }else if(lottery.prizeNum==4){
- //alert("恭喜您,中了第5个奖品")
- }else if(lottery.prizeNum==5){
- //alert("恭喜您,中了第5个奖品")
- }else if(lottery.prizeNum==5&&lottery.shared==0&&lottery.cNum==0){
- //alert("恭喜您,中了第5个奖品")
- }else if(lottery.prizeNum==6){
- //alert("恭喜您,中了第5个奖品")
- }else if(lottery.prizeNum==7){
- //alert("恭喜您,中了第5个奖品")
- }
- clearTimeout(lottery.timer);
- lottery.prizeNum=-1;
- lottery.times=0;
- click=false;
- }else{
- if (lottery.times<lottery.bufferNum) {
- lottery.speed-=10;
- }else if(lottery.times==lottery.bufferNum) {
- //var beginning = Math.random()*(lottery.countNum)|0;
- //lottery.prizeNum = 3;
- }else{
- if (lottery.times>lottery.bufferNum&&((lottery.prizeNum==0&&lottery.beginning==7)||lottery.prizeNum==lottery.beginning+1)){
- lottery.speed+=110;
- }else{
- lottery.speed+=20;
- }
- }
- if (lottery.speed<40) {
- lottery.speed=40;
- };
- //console.log(lottery.times+'^^^^^^'+lottery.speed+'^^^^^^^'+lottery.prizeNum);
- lottery.timer=setTimeout(lottery.beginFun,lottery.speed);
- }
- return false;
- },
- initFun:function(className){
- //该模块主要是选择器,最后给起点加上CSS样式
- if ($("."+className).find(".prize_").length>0){
- $objD=$("."+className);
- $childNode=$objD.find(".prize_");
- this.obj=$objD;
- this.countNum=$childNode.length;
- $objD.find(".prize_"+this.index).addClass("selected");
- };
- },
- rollFun:function(){
- //该模块主要是步进值循环移除及添加,到终点后设置Index值为0
- var index=this.beginning;
- var count=this.countNum;
- var objD=this.obj;
- $(objD).find(".prize_"+index).removeClass("selected");
- index+=1;
- if (index>count){
- index=0;
- };
- $(objD).find(".prize_"+index).addClass("selected");
- this.beginning=index;
- return false;
- },
- stopFun:function(index){
- this.prizeNum=index;
- return false;
- }
- };
- //获取整体的宽度并设置子节点宽度
- var _lotteryBoxWidth=$(".lotteryBox").width();
- $(".lottery").css({"width":_lotteryBoxWidth,"height":_lotteryBoxWidth});
- //点击抽奖按钮调用公共方法
- $(".start_").click(function(){
- lottery.initFun('lottery');
- lottery.prizeNum=5;
- lottery.speed=100;
- lottery.cNum=1;
- //开始抽奖执行方法
- lottery.beginFun();
- });
- </script>
- </html>
服务器端判断客户端浏览器类型
如何判断微信内置浏览器,首先需要获取微信内置浏览器的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是:
Mozilla/5.0 (iPhone; CPU iPhone OS 6_1_3 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Mobile/10B329 MicroMessenger/5.0.1
所以通过识别 MicroMessenger 这个关键字来确定是否微信内置的浏览器了。
JAVA 判断是否微信浏览器
- <%
- String ua=((HttpServletRequest) request).getHeader("user-agent").toLowerCase();
- if (ua.indexOf("micromessenger") > 0) {// 是微信浏览器
- validation = true;
- }
- %>
- /***************************************************
- * 判断浏览器类型是否是IE,是则返回true,不是返回false
- * ServletActionContext是struts2上下文对象
- * @return boolean
- **************************************************/
- public static boolean isIE(){
- return ServletActionContext.getRequest().getHeader( "USER-AGENT" ).toLowerCase().indexOf( "msie" )>0?true:false ;
- }
方案一:正则表达式
通过观察规律,得出以下表达式:
- ;\s?([^;]+?)\s?(Build)?/
Java代码:
- Pattern pattern = Pattern.compile(";\\s?(\\S*?\\s?\\S*?)\\s?(Build)?/");
- Matcher matcher = pattern.matcher(userAgent);
- String model = null;
- if (matcher.find()) {
- model = matcher.group(1).trim();
- log.debug("通过userAgent解析出机型:" + model);
- }
以下为部分UserAgent,供测试,可以直接在EditPlus里验证。
Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; R8007 Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; R8007 Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 V1_AND_SQ_5.0.0_146_YYB_D QQ/5.0.0.2215
Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; SM-N9009 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.3 Mobile Safari/537.36
Mozilla/5.0 (Linux; Android 4.2.2; zh-cn; SCH-I959 Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Version/1.0 Chrome/18.0.1025.308 Mobile Safari/535.19
Mozilla/5.0 (Linux; U; Android 4.3; zh-CN; SM-N9009 Build/JSS15J) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.2.467 U3/0.8.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 4.1.2; zh-CN; Coolpad 5891 Build/JZO54K) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.3.478 U3/0.8.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 4.1.2; zh-cn; Coolpad 5891 Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 V1_AND_SQ_5.0.0_146_YYB2_D QQ/5.0.0.2215
Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53
Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Mobile/11D257 QQ/5.0.0.165
Mozilla/5.0 (Linux; Android 4.3; zh-cn; SAMSUNG-GT-I9308_TD/1.0 Android/4.3 Release/11.15.2013 Browser/AppleWebKit534.30 Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 SogouMSE,SogouMobileBrowser/3.2.3
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; SCH-I959 Build/JDQ39) AppleWebKit/534.24 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.24 T5/2.0 baidubrowser/5.0.3.10 (Baidu; P1 4.2.2)
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-cn; SCH-I959 Build/JDQ39) AppleWebKit/534.24 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.24 T5/2.0
Mozilla/5.0 (Linux; Android 4.3; SM-N9009 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36 OPR/24.0.1565.82529
Mozilla/5.0 (Linux; U; Android 4.4.4; zh-CN; Nexus 4 Build/KTU84P) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.2.467 U3/0.8.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; HUAWEI C8825D Build/HuaweiC8825D) AppleWebKit/534.24 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.24 T5/2.0 baidubrowser/5.2.3.0 (Baidu; P1 4.0.4)
Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; HUAWEI C8825D Build/HuaweiC8825D) AppleWebKit/537.36 (KHTML, like Gecko)Version/4.0 MQQBrowser/5.3 Mobile Safari/537.36
Mozilla/5.0 (Linux; Android 4.0.4; HUAWEI C8825D Build/HuaweiC8825D) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36
Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; HUAWEI C8825D Build/HuaweiC8825D) AppleWebKit/535.19 (KHTML, like Gecko) Version/4.0 LieBaoFast/2.12.0 Mobile Safari/535.19
Opera/9.80 (Android; Opera Mini/7.0.31907/34.2499; U; zh) Presto/2.8.119 Version/11.10
Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; HW-HUAWEI_C8825D/C8825DV100R001C92B943SP01; 480*800; CTC/2.0) AppleWebKit/534.30 Mobile Safari/534.30
Mozilla/5.0 (Linux; U; Android 4.4.2; zh-CN; SGP521 Build/17.1.2.A.0.314) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.2.467 U3/0.8.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; Android 4.4.2; SGP521 Build/17.1.2.A.0.314) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Safari/537.36
Mozilla/5.0 (Linux; U; Android 4.0.4; zh-CN; HUAWEI C8825D Build/HuaweiC8825D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.8.5.442 U3/0.8.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; GT-N7100 Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Mozilla/5.0 (Linux; Android 4.4.2; zh-cn; SAMSUNG-SM-N9009 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Version/1.5 Chrome/28.0.1500.94 Mobile Safari/537.36
Mozilla/5.0 (Linux; U; Android 4.2.2; zh-CN; HTC HTL22 Build/JDQ39) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.2.467 U3/0.8.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; Android 4.3; SM-N9009 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.117 Mobile Safari/537.36
Mozilla/5.0 (Linux; U; Android 4.2.1; zh-cn; AMOI A920W Build/JOP40D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Mozilla/5.0 (Linux; Android 4.3; SM-N9009 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.135 Mobile Safari/537.36
Mozilla/5.0 (Linux; U; Android 4.1.1; zh-CN; GT-N7100 Build/JRO03C) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.9.2.467 U3/0.8.0 Mobile Safari/533.1
Mozilla/5.0 (Linux; U; Android 4.3; zh-cn; R8007 Build/JLS36C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Huawei U8800 Android 2.3.3 Baidu 2.2 Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn) AppleWebKit/530.17 (KHTML, like Gecko) FlyFlow/2.2 Version/4.0 Mobile Safari/530.17 有用(0)
Huawei U8800 Android 2.3.3 UC 8.7 Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; U8800 Build/HuaweiU8800) UC AppleWebKit/534.31 (KHTML, like Gecko) Mobile Safari/534.31 有用(0)
Meizu MX M031 Android 4.0.3 Chrome 18 Mozilla/5.0 (Linux; Android 4.0.3; M031 Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19 有用(0)
Meizu MX M031 Android 4.0.3 Opera 12.1 Opera/9.80 (Android 4.0.3; Linux; Opera Mobi/ADR-1210241511) Presto/2.11.355 Version/12.10 有用(0)
Meizu MX M031 Android 4.0.3 -built-in * Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M031 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 有用(0)
Meizu MX M031 Android 4.0.3 Baidu 2.2 Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn) AppleWebKit/530.17 (KHTML, like Gecko) FlyFlow/2.2 Version/4.0 Mobile Safari/530.17 有用(0)
Meizu MX M031 Android 4.0.3 UC 8.7 Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M031 Build/IML74K) UC AppleWebKit/534.31 (KHTML, like Gecko) Mobile Safari/534.31 有用(0)
Meizu M9 Android 4.0.3 QQ 3.7 MQQBrowser/3.7/Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M9 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 Normal Mode 有用(0)
Meizu M9 Android 4.0.3 QQ 3.5 MQQBrowser/3.5/Adr (Linux; U; 4.0.3; zh-cn; M9 Build/Flyme 1.0.1;640*960) Speed Mode 有用(0)
Meizu M9 Android 4.0.3 -built-in * Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M9 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 有用(0)
Meizu M9 Android 4.0.3 QQ 3.5 MQQBrowser/3.5/Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M9 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 Normal Mode 有用(0)
Meizu MX M031 Android 4.0.3 Maxthon 2.7 Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M031 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 有用(0)
Huawei U8800 Android 2.3.3 Maxthon 2.7 Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; U8800 Build/HuaweiU8800) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 有用(0)
Huawei U8800 Android 2.3.3 QQ 3.7 MQQBrowser/3.7/Adr (Linux; U; 2.3.5; zh-cn; U8800 Build/U8800V100R001C00B528G002;480*800) Speed Mode 有用(0)
Huawei U8800 Android 2.3.3 Dolphin 9.1 Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; U8800 Build/HuaweiU8800) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 有用(0)
Huawei U8800 Android 2.3.3 QQ 3.7 MQQBrowser/3.7/Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; U8800 Build/HuaweiU8800) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 Normal Mode 有用(0)
Huawei U8800 Android 2.3.3 -built-in * Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; U8800 Build/HuaweiU8800) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Samsung P6200(GALAXY Tab) Android 3.2 -built-in * Mozilla/5.0 (Linux; U; Android 3.2; zh-cn; GT-P6200 Build/HTJ85B) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13 有用(0)
Huawei U8800 Android 2.3.3 Maxthon 4.0 Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; U8800 Build/HuaweiU8800) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 有用(0)
Meizu MX M031 Android 4.0.3 Baidu 2.3 Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M031 Build/IML74K) AppleWebKit/530.17 (KHTML, like Gecko) FlyFlow/2.3 Version/4.0 Mobile Safari/530.17 baidubrowser/023_1.41.3.2_diordna_069_046/uzieM_51_3.0.4_130M/1200a/963E77C7DAC3FA587DF3A7798517939D%7C408994110686468/1 有用(0)
Huawei U8800 Android 2.3.3 Baidu 2.3 Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; U8800 Build/HuaweiU8800) AppleWebKit/530.17 (KHTML, like Gecko) FlyFlow/2.3 Version/4.0 Mobile Safari/530.17 baidubrowser/042_1.6.3.2_diordna_008_084/IEWAUH_01_5.3.2_0088U/1001a/BE44DF7FABA8768B2A1B1E93C4BAD478%7C898293140340353/1 有用(0)
Huawei U8800 Android 2.3.3 Dolphin 9.2 Mozilla/5.0 (Linux; U; Android 2.3.5; zh-cn; U8800 Build/HuaweiU8800) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 有用(0)
HTC S720e(One X) Android 4.0.3 -built-in * Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; HTC S720e Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 有用(1)
HTC S720e(One X) Android 4.0.3 UC 8.7 Mozilla/5.0 (Linux; U; Android 4.0.4; zh-cn; HTC S720e Build/IMM76D) UC AppleWebKit/534.31 (KHTML, like Gecko) Mobile Safari/534.31 有用(0)
Meizu MX M031 Android 4.0.3 Dolphin Min 2.3 Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M031 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 有用(0)
Meizu MX M031 Android 4.0.3 QQ 4.0 MQQBrowser/4.0/Mozilla/5.0 (Linux; U; Android 4.0.3; zh-cn; M031 Build/IML74K) AppleWebKit/533.1 (KHTML, like Gecko) Mobile Safari/533.1 有用(0)
Meizu M9 Android 4.0.3 QQ 3.7 MQQBrowser/3.7/Adr (Linux; U; 4.0.3; zh-cn; M9 Build/Flyme 1.0.1;640*960)
Meizu MX2 M040 Android 4.1 UC 9.4 Mozilla/5.0 (Linux; U; Android 4.1.1; zh-CN; M040 Build/JRO03H) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 UCBrowser/9.4.1.362 U3/0.8.0 Mobile Safari/533.1 有用(0)
Meizu MX2 M040 Android 4.1 Chrome 31 Mozilla/5.0 (Linux; Android 4.1.1; M040 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.59 Mobile Safari/537.36 有用(0)
Meizu MX2 M040 Android 4.1 猎豹 2.8 Mozilla/5.0 (Linux; Android 4.1.1; M040 Build/JRO03H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.64 Mobile Safari/537.36 有用(0)
Meizu MX2 M040 Android 4.1 Baidu 4.1 Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; M040 Build/JRO03H) AppleWebKit/534.24 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.24 T5/2.0 baidubrowser/4.2.4.0 (Baidu; P1 4.1.1) 有用(0)
Meizu MX M031 Android 4.1 -built-in * Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; M031 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 有用(1)
Meizu MX M031 Android 4.1 UC 8.8 Mozilla/5.0 (Linux; U; Android 4.1.1; zh-CN; M031 Build/JRO03H) AppleWebKit/534.31 (KHTML, like Gecko) UCBrowser/8.8.3.278 U3/0.8.0 Mobile Safari/534.31 有用(0)
Meizu MX2 M040 Android 4.1 QQ 4.1 Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; M040 Build/JRO03H) AppleWebKit/533.1 (KHTML, like Gecko)Version/4.0 MQQBrowser/4.1 Mobile Safari/533.1 有用(0)
Meizu MX2 M040 Android 4.1 -built-in * Mozilla/5.0 (Linux; U; Android 4.1.1; zh-cn; M040 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 有用(2)
Samsung P6200(GALAXY Tab) Android 3.2 QQ HD 2.1 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 有用(0)
Samsung P6200(GALAXY Tab) Android 3.2 UC HD 2.3 Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3) AppleWebKit/534.31 (KHTML, like Gecko) Chrome/17.0.558.0 Safari/534.31 UCBrowser/2.3.1.257
通过验证,成功率95%以上。
PHP 判断是否微信浏览器
- function is_weixin(){
- if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !==false){
- return true;
- }
- return false;
- }
JavaScript判断是否微信浏览器
- function is_weixin(){
- var ua=navigator.userAgent.toLowerCase();
- if(ua.match(/MicroMessenger/i)=="micromessenger"){
- return true;
- }else{
- return false;
- }
- }
【转载】使用PHP-FPM避免Nginx下的spawn-fcgi漏洞
之前传出的nginx漏洞其实不算是nginx的问题,而是spawn-fcgi的漏洞。张宴的博客总结了一份比较简单的方法(再提供一种解决Nginx文件类型错误解析漏洞的方法),利用正则规避了这个问题。不过这些解决方法都是治标不治本,我个人建议使用php-fpm代替spawn-fcgi。
php-fpm曾经是PHP项目的一个补丁,旨在将FastCGI进程管理整合进PHP包中。现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了php-fpm的分支,据说下个版本会融合进PHP的主分支去。
相对spawn-fcgi,php-fpm在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而php-fpm则没有这种烦恼。
如果你使用Ubuntu/Debian而且不想编译,可以尝试这个方法,安装最新的PHP 5.3.2及php-fpm 0.6包。但我个人使用的过程中发现这种方式可能导致一些像mcrypt等扩展无法使用,所以还是采用了源码安装的方式。
先确定安装了subversion等一些包
$ sudo apt-get install bison libxml2-dev libbz2-dev libpcre3-dev libssl-dev zlib1g-dev libmcrypt-dev libmhash-dev libmhash2 libcurl4-openssl-dev libpq-dev libpq5 libsyck0-dev
$ svn co http://svn.php.net/repository/php/php-src/branches/PHP_5_3_FPM php_5_3_fpm$ cd php_5_3_fpm
请先确定已经安装了autoconf2.13这个包,注意版本号。新版本的autoconf可能会导致无法生成配置文件
$ ./buildconf --force
配置你的php,一定要有--enable-fpm
$ ./configure --enable-fpm --with-foo --enable-bar...
我使用的配置方式,ubuntu的很多开发包没有安装,所以这个步要安装各种开发包,挺花时间的。
$ ./configure --enable-fastcgi --enable-fpm --with-mcrypt --with-zlib --enable-mbstring --with-pdo --with-pgsql --with-curl --disable-debug --enable-pic --enable-inline-optimization --with-xml --enable-sockets --enable-sysvsem --enable-sysvshm --enable-pcntl --enable-mbregex --with-mhash --enable-xslt --enable-memcache --enable-zip --with-pcre-regex --with-gd --with-sqlite --enable-exif --enable-zip --enable-ftp --with-pear --with-libxml-dir --with-mysql --with-openssl
编译和安装
$ sudo make && make install
安装后修改/usr/local/etc/php-fpm.conf,把所有的nobody改成你运行php-fpm的用户组和用户名,一般是www-data。修改一下,如果你的服务器内存比较小,建议从5开始递增修改,子进程会占用比较多的内存。
<value name="max_children">5</value>
完成后,运行
php-fpm -c /path/to/your/php.ini
这个操作没有回显,默认在127.0.0.1:9000打开一个PHP的fastcgi服务,用类似spawn-fcgi的方法把php文件的处理pass给php-fpm即可。记得加入下面的参数,以避免一些古怪的问题引起502 Gateway错误。
location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /path/to/your/root$fastcgi_script_name; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; include fastcgi_params; }