Yii通过preload组件,使得https跳转到http

之前文章有涉及到http跳转到https的nginx跳转,这里是它的相反操作。
有时候网站并没有对https访问做到很好的支持,所以要让某些https的链接跳转到http.
对于Yii框架,可以利用preload这个组件,每次进入网站前先判断是否https安全链接,如果是安全链接则直接301跳转到相应的http页面。
一 配置config

'components' => array(
        'httpsRedirect' => array(
            'class' => 'HttpsRedirect',
        ),
),
'preload' => array(
        'httpsRedirect',
    )

二 添加HttpsRedirect类

<?php
/*
 * PC站https redirect
 * 请求到PC站的https 暂时301跳转到http
 */
class HttpsRedirect extends CComponent {
    
    public function init() {
        $request = Yii::app()->getRequest();
        if ($request->getIsSecureConnection() == false) {
        	return;
        }
        $host = $_SERVER['HTTP_HOST'];
        $uri  = $request->requestUri;
        switch($host) {
        	case 'your pass host':  $flag = true; break;
                case 'your pass host':  $flag = true; break;
                case 'your pass host':  $flag = true; break;
                case 'your pass host':  $flag = true; break;
        	default:                $flag = false;          
        }
        if($flag) {
            Header("HTTP/1.1 301 Moved Permanently");
            Header("Location: http://{$host}{$uri}");
        } 
    } 
}

这样就在php代码层面做到简单的https跳转到http啦。

nginx强制使用https访问的三种方法(http跳转到https)

原文:http://blog.csdn.net/wzy_1988/article/details/8549290

需求简介

基于nginx搭建了一个https访问的虚拟主机,监听的域名是test.com,但是很多用户不清楚https和http的区别,会很容易敲成http://test.com,这时会报出404错误,所以我需要做基于test.com域名的http向https的强制跳转

我总结了三种方式,跟大家共享一下

nginx的rewrite方法

思路

这应该是大家最容易想到的方法,将所有的http请求通过rewrite重写到https上即可

配置

  1. server {
  2.     listen  192.168.1.111:80;
  3.     server_name test.com;
  4.     rewrite ^(.*)$  https://$host$1 permanent;
  5. }

搭建此虚拟主机完成后,就可以将http://test.com的请求全部重写到https://test.com上了

nginx的497状态码

 

error code 497

  1. 497 – normal request was sent to HTTPS

解释:当此虚拟站点只允许https访问时,当用http访问时nginx会报出497错误码

思路

利用error_page命令将497状态码的链接重定向到https://test.com这个域名上

配置

  1. server {
  2.     listen       192.168.1.11:443;  #ssl端口
  3.     listen       192.168.1.11:80;   #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口
  4.     server_name  test.com;
  5.     #为一个server{……}开启ssl支持
  6.     ssl                  on;
  7.     #指定PEM格式的证书文件
  8.     ssl_certificate      /etc/nginx/test.pem;
  9.     #指定PEM格式的私钥文件
  10.     ssl_certificate_key  /etc/nginx/test.key;
  11.     #让http请求重定向到https请求
  12.     error_page 497  https://$host$uri?$args;
  13. }

index.html刷新网页

 

思路

上述两种方法均会耗费服务器的资源,我们用curl访问baidu.com试一下,看百度的公司是如何实现baidu.com向www.baidu.com的跳转
可以看到百度很巧妙的利用meta的刷新作用,将baidu.com跳转到www.baidu.com.因此我们可以基于http://test.com的虚拟主机路径下也写一个index.html,内容就是http向https的跳转

index.html

  1. <html>
  2. <meta http-equiv=”refresh” content=”0;url=https://test.com/”>
  3. </html>

nginx虚拟主机配置

  1. server {
  2.     listen 192.168.1.11:80;
  3.     server_name test.com;
  4.     location / {
  5.                 #index.html放在虚拟主机监听的根目录下
  6.         root /srv/www/http.test.com/;
  7.     }
  8.         #将404的页面重定向到https的首页
  9.     error_page  404 https://test.com/;
  10. }

后记

上述三种方法均可以实现基于nginx强制将http请求跳转到https请求,大家可以评价一下优劣或者根据实际需求进行选择。

【转】微信公众平台配置

http://www.cnblogs.com/mchina/archive/2013/06/05/3108618.html

微信公众平台开发(二) 微信公众平台示例代码分析http://www.cnblogs.com/mchina/archive/2013/06/07/3120592.html

一、简介

微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字、图片、语音的全方位沟通、互动。

二、通讯机制

三、注册微信平台公众帐号

注册地址:https://mp.weixin.qq.com

四、服务器端配置

4.1 示例代码设置

微信公众平台提供了一个php示例代码:

http://mp.weixin.qq.com/mpres/htmledition/res/wx_sample.zip

下载下来,解压缩,打开编辑。

将token值设置为你所需要的值,token可由开发者任意填写,用作生成签名。

编辑完保存并关闭文件,将文件wx_sample.php 更改成自定义的名字,这里改为wxapi.php,再次打包成wxapi.zip。

4.2 服务器平台设置

如果有自己的服务器,而且支持php,可以将接口文件上传至服务器,如果没有自己的服务器,则可以选择部分免费的云平台进行开发,如百度应用引擎BAE(http://developer.baidu.com/bae),新浪云平台SAE(http://sae.sina.com.cn/)。

4.2.1 百度BAE设置

a. 注册BAE帐户并登录

https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F

b. 加入开发者中心

c. 创建应用

接入方式选择 “手机web应用”。

d. 托管设置

选择云环境(BAE)-> 托管设置。

环境类型 选择 “PHP”。

e. 创建新版本,上传接口文件

f. 上线并获取链接

获得的URL为:http://zhuojin.duapp.com/

注:zhuojinsz 之前已经被我注册过了,所以不能再次注册。这里应该获得的二级域名应该和上面的截图中写的一样。

BAE 设置完毕。

4.2.2 新浪SAE设置

a. 注册SAE帐户并登录

http://sae.sina.com.cn/

b. 创建新应用

我的首页 -> 创建新应用

c. 配置应用

d. 上传代码

应用管理 -> 代码管理 -> 上传代码包

e. 获取URL地址

获得的URL 地址为:http://1.zhuojin.sinaapp.com/

SAE 配置完毕。

五、配置接口

5.1 登录微信公众平台 -> 高能功能 -> 开发模式

5.2 成为开发者

5.3 接口配置信息

URL填写上面得到的BAE URL:http://zhuojin.duapp.com/,再加上上传的php文件名。即 http://zhuojin.duapp.com/wxapi.php

Token 填写自定义的token 值,这里为zhuojinsz。

对于SAE,URL填写 http://1.zhuojin.sinaapp.com/wxapi.php

5.4 提交

点击 “提交”,若一切设置正确,则会提示 “提交成功”。

5.5 查看接口配置信息

BAE 接口信息

SAE 接口信息

5.6 开启开发模式

至此,配置完毕。

六、关注

请关注 卓锦苏州 微信公众帐号,卓锦苏州 基于SAE 平台开发,针对于主流的微信功能进行开发测试。

您可以关注 卓锦苏州 公众帐号进行功能测试,以及获取新的应用开发。

1. 登录微信客户端,通讯录 -> 添加朋友 -> 查找公众号 -> zhuojinsz,查找并关注。

2. 扫描二维码:

卓锦苏州 小黄鸡测试。

[算法]求最大连续子数组和的PHP程序

之前遇到过这样一道题目:一个任意长度的整数数组{1,-3,4,5,6,7,-6,10,-15},求最大的连续子数组和。这里就是4,5,6,7,-6,10的和。这道题运用动态规划的思想,找以数组下标i位置的最大和Max[i]。
Max[i] = (Max[i-1] > 0) ? (Max[i-1] + Max[i] ) : Max[i];
之后在所有Max[i]中求一个最大值即可,时间复杂度为O(n),以下程序用php代码写出:

&lt;?php  
function maxArr($arr) {  
  
    $max    = $arr[0]; //最大值  
    $endMax = $arr[0]; //以KEY结尾的最大值  
  
    foreach($arr as $key =&gt; $value) {  
        if($key == 0) {  
            //以0结尾作为开始,这里直接跳过  
            continue;  
        }  
  
        $endMax = ($endMax &gt; 0) ?  ($endMax + $value) : $value;  //以$key结尾的数组最大值  
        $max    = ($endMax &gt; $max) ? $endMax : $max;             //总的最大值  
    }  
    return $max;  
}  
//测试用例  
$test = array(-1,4,5,6,-10,12,-2,1);  
echo maxArr($test);  

Yii框架下安装xhprof

xhprof 是一款非常不错的php性能分析工具,由facebook开发,有直观的图形分析,可以看到各个流程的性能损耗。下面是在Yii框架下安装xhprof
1,安装xhprof
如果安装了php,很简单执行:pecl install xhprof 就可以了
否则找个靠谱的源 sudo yum install xhprof 也可以
2,配置php.ini

1 view plaincopy
[xhprof]  
extension=xhprof.so  
xhprof.output_dir=/home/work/tmp/xhprof  

其中oupput_idr 是输出文件的目录
3,安装libpng

wget http://nchc.dl.sourceforge.net/project/libpng/libpng15/1.5.1/libpng-1.5.1.tar.gz  
tar zxf libpng-1.5.1.tar.gz  
cd libpng-1.5.1  
./configure  
make  
make install 

或者直接sudo yum install libpng* 简单
4 安装Graphviz

 
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz  
tar zxf graphviz-2.24.0.tar.gz  
cd graphviz-2.24.0  
./configure --with-png=yes
make  
make install

5 配置nginx


server {  
    listen 8088;  
    root /home/work/local/php-5.5.18/lib/php/xhprof_html;  
  
    location @php {  
        include fastcgi_params;  
        fastcgi_param  SCRIPT_FILENAME &quot;$document_root/index.php&quot;;  
        fastcgi_pass php;  
    }     
  
    location ~ /robots\.(txt|php) {  
        include fastcgi_params;  
        fastcgi_param  SCRIPT_FILENAME &quot;$document_root/robots.php&quot;;  
        fastcgi_pass php;  
    }     
  
    location ~ \.php$ {  
        include fastcgi_params;  
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  
        fastcgi_pass php;  
        fastcgi_index index.php;  
    }     
  
  
    location / {   
        try_files $uri @php;  
    }     
}  

重启nginx , nginx -s reload
重启php-fpm , pkill -USR2 php-fpm, php-fpm
6 配置Yii框架下使用xhprof
找到protected目录下的yii.php
加入以下代码

public static function createApplication($class,$config=null) {  
&lt;span style=&quot;white-space:pre&quot;&gt;    &lt;/span&gt;$app-&gt;attachEventHandler(&quot;onBeginRequest&quot;, function() {  
                xhprof_enable(XHPROF_FLAGS_NO_BUILTINS);  
            });   
       $app-&gt;attachEventHandler(&quot;onEndRequest&quot;, function() use ($app) {  
                $data = xhprof_disable();   //返回运行数据  
                include_once &quot;xhprof_lib/utils/xhprof_runs.php&quot;;  
                $objXhprofRun = new XHProfRuns_Default();   
                $run_id = $objXhprofRun-&gt;save_run($data, $app-&gt;name);  
            });   
}  

7 结束
打开你的任意网页,会在/home/work/tmp/xhprof目录下产生性能分析文件,之后通过localhost:8088/index.php就可以访问文件了,点击view_all_callgraph还可以看到直观的性能分析图。

[VIM]Linux下打造自己的IDE

对于用惯IDE的同学,突然用Vim会发现没有那么快捷和方便,以下用到的三个插件能打造VIM 比较方便的效果,先看效果:

要用到如此效果需要三个插件:
一 NERDTree
下载地址:http://www.vim.org/scripts/script.php?script_id=1658
然后解压,解压缩后把plugin,doc,syntax,nerdtree_plugin四个目录复制到/usr/share/vim/vim73/目录下,即可完成安装。
之后输入:NERDTre就可以打开
二 安装Taglist
taglist
下载下载Taglist
cp doc/taglist.txt /usr/share/vim/vim72/doc/
cp plugin/taglist.vim /usr/share/vim/vim72/plugin/
安装ctags => ctags -R
vimrc
let Tlist_Show_One_File=1 “只显示当前文件的tags
let Tlist_WinWidth=40 “设置taglist宽度
let Tlist_Exit_OnlyWindow=1 “tagList窗口是最后一个窗口,则退出Vim
let Tlist_Use_Right_Window=1 “在Vim窗口右侧显示taglist窗口
:Tlist就可以打开Taglist ,显示所有变量和函数
三 winmanager
前面介绍的几个工具和插件,主要提供快捷的编辑功能,如定义跳转,符号查询,符号提示与补全等。这里的三个插件,主要优化布置VIm的界面。具体来说,NERDTree提供树形浏览文件系统的界面,MiniBufExplorer提供多文件同时编辑功能,而Winmanager将这NERDTree界面和Taglist界面整合起来,使Vim更像VS!

分别从http://www.vim.org/scripts/script.php?script_id=1658
http://www.vim.org/scripts/script.php?script_id=159
http://www.vim.org/scripts/script.php?script_id=95
下载NERDTree,MiniBufExplorer和Winmanager安装包(Winmanager还有个更新的vba版本http://www.vim.org/scripts/script.php?script_id=1440,这里选用旧版本的Winmanger)。
1)像其它插件一样,将NERDTree安装包解压到~/.vim目录。并进入doc目录,在Vim命令行下运行”helptags .”命令。
2)MiniBufExplorer只有一个.vim文件,将其拷贝到~/.vim/plugin目录。
3)在~/.vimrc文件中加入以下几行:

let g:miniBufExplMapWindowNavVim = 1   
let g:miniBufExplMapWindowNavArrows = 1   
let g:miniBufExplMapCTabSwitchBufs = 1   
let g:miniBufExplModSelTarget = 1  
let g:miniBufExplMoreThanOne=0 

4)将Winmanager安装包解压到~/.vim目录。
5)在~/.vimrc文件中加入以下几行

let g:NERDTree_title=&quot;[NERDTree]&quot;  
let g:winManagerWindowLayout=&quot;NERDTree|TagList&quot;  
  
function! NERDTree_Start()  
    exec 'NERDTree'  
endfunction  
  
function! NERDTree_IsValid()  
    return 1  
endfunction  
  
nmap wm :WMToggle&lt;CR&gt; 

6)这个版本的Winmanager好像有个小bug,你在打开Winmanager界面时,会同时打开一个空的文件。这会影响后续使用,所以我们要在打开Winmanager时关掉这个空文件。在~/.vim/plugin目录下的winmanager.vim文件中找到以下函数定义并在第5行下添加第6行的内容:

1 view plaincopy
function! &lt;SID&gt;ToggleWindowsManager()  
   if IsWinManagerVisible()  
      call s:CloseWindowsManager()  
   else  
      call s:StartWindowsManager()  
      exe 'q'  
   end  
endfunction

到这里,就大功告成了!
好啦 可以愉快的使用VIM了!!~~

c++函数实现*的正则匹配判断功能

今天在面试的时候面试官出了一道算法题,给出字符串a和字符串b,其中字符串a含有*,这个匹配所有的正则表达式符号,让写出一个函数判断字符串b是否符合规则,面试的时候有些紧张,思路又有些乱,写了一晚上终于成功了,这里提供一下我的算法,欢迎交流沟通。首先贴上完成的代码:

#include&lt;iostream&gt;
using namespace std;

/**********************************************************************
* 名    称:bool match(char *a, char *b, int startA, int startB)
* 功    能:匹配字符串b是否符合正则表达式规则
* 输入参数:字符串a(带*号匹配规则), 字符串b(被匹配的字符), a字符串开始的位置startA, b字符串开始的位置startB
* 返回参数:bool类型
-----------------------------------------------------------------------
* 说    明:无
***********************************************************************/
bool match(char *a, char *b, int startA, int startB)
{
	//字符串a,b的长度
	int lenA   = strlen(a);
	int lenB   = strlen(b);
	//posB,b字符串的startB位置标记
	int	posB = startB;
	//a,b同时结束返回真
	if(startA == lenA &amp;&amp; startB == lenB)
	{
		return true;
	}
	//不是*开头 一定要匹配b
	if(a[startA] != '*')
	{
		if(a[startA] != b[startB])
		{
			return false;
		}
		//递归
		return match(a, b, ++startA, ++startB);

	}else{
		//是*开头 找到非*开始的地方
		while(a[startA] == '*' &amp;&amp; startA &lt; lenA)
		{
			startA ++;
		}
		//以*结尾 同时遍历结束 返回真
		if(startA == lenA &amp;&amp; startB == lenB)
		{
			return true;
		}
	}
	//记录a的位置
	int posA = startA;
	while(startB &lt; lenB) 
	{
		//遍历b找到 与startA 相同的字符
		while(a[startA] != b[startB] &amp;&amp; startB &lt; lenB) 
		{
			startB ++;
		}	
		posB = startB;
		//相同均++, a到头或者a遍历到*结束
		while(a[startA] == b[startB] &amp;&amp; startA &lt; lenA &amp;&amp; a[startA] != '*')
		{
			startA ++;
			startB ++;
		}
		//a遍历到*并且没有结束的情况递归
		while(a[startA] == '*' &amp;&amp; startA &lt; lenA) 
		{
			return match(a, b, startA, startB);
		}
		//a,b同时到头的情况,返回true
		if(startA == lenA &amp;&amp; startB == lenB) {
			
			return true;
		}
		//没有发现满足的字符串,b的startB + 1,在次做遍历
		startA = posA;
		startB = posB + 1;
	}
	return false;
}


void main() 
{
	char *a = &quot;*a*b*c*&quot;;
	char *b = &quot;adbaeabeaeac&quot;;

	bool c = match(a, b, 0, 0);
	cout&lt;&lt;c&lt;&lt;endl;

}

算法解析:
函数是用C++写的,运用递归的思想。分为*开头和非*开头的情况。非*开头一路找到非*的位置开始匹配。
这里有个小坑,例如在字符串ababababcab中找abc的位置,这是比较常见的KMP算法,数据结构中有学,这里找到abc的位置后,两个字符串进行截取后再递归调用函数
测试用例:
分别进行了以下测试用例
字符串a为,字符串为符合和不符合的情况

测试通过!!
有兴趣的朋友们可以自己下载程序试一试,同时欢迎提供更好的算法。

Zend Studio 基本设置

使用IDE编码快捷方便,但是需要一些tab和编码风格的设置,下面是新手第一次配置IDE的简单方法。
一 连接远程文件
我们的代码文件全部放在linux开发机上,首先需要连接到开发机上的代码
1点击File->PHP Project from Remote Server

2,点击Manage,输入host及用户名密码,同时点击Test Connection测试连接是否正常。

3,接下来开始拉代码,会有树级目录,选择需要的目录即可。
注意Zend并不会实时更新Linux机器上的代码,如果在远端使用VIM直接修改文件后,记得在文件上点击右键->RemoteServers->Download from server更新代码。

二 设置Tab键默认为4个空格
为了兼容代码的格式,一般不建议使用Tab键,所以设置Tab为4个空格后,使用Tab全部变为4个空格,检测方法是用了Tab键再次按Back space键,如果一次只回一个空格距离,则设置成功。

1,点击Window->Preferences->General->Editors->TextEditors
在Displayed tab width 输入4

2,点击PHP->CodeStyle->Formatter->Edit选择Spaces 填入红色框中的数字4,4即可

3 最后在General->Workspace中选择UTF-8和Unix编码风格即可。

好啦,设置以上步骤后,就可以愉快的便代码啦!
*以上图片截取Zend Studio 10.6

[GIT]git创建及其使用心得

本文章涉及到了git的创建和基本操作,适合初学者使用

查看本地分支 git branch
切换分支 git checkout ‘name’
删除本地分支 git branch -d ‘name’
创建新分支 并切换到改分支 git checkout -b ‘name’
查看线上分支 git branch -r
克隆并创建分支 git checkout -b ‘newname’ master
本地分支提交到远程 git push origin ‘name’
撤销本地的修改 git checkout — 文件名
撤销本次提交的代码 git reset –hard HEAD~1

查看所有版本 git reflog
回到某个版本 git reset –hard XXXXX

分支提交 git push origin resblock 最后为分支名
分支下载 git pull origin resblock ‘resblock 为分支名’
删除远程分支 git push origin : 自己分支名 删除远程分支
合分支 git merge deyou(分支名) –no-ff git push origin master
rebase
在自己分支上进行 git rebase master 处理冲突后进行 git rebase –continue 放弃处理 git rebase -abort
git checkout –our

//暂存修改
git stash
git stash pop

//修改配置,快捷键
vim ~/.gitconfig
[alias]
last = log >—lg = log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit
lg = log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit
ci = commit
br = branch
co = checkout
df = diff
st = status

创建自己的git方法
1, 下载git 找到相应目录,git init
2, 根目录下去寻找.ssh目录。寻找SSH KEY

$ ssh-keygen -t rsa -C &quot;youremail@example.com&quot;

3, 登录github 打开account setting Add SSH KEY
4, Create
a new repo
5, 按照提示
//git init
//git add README.md
//git commit -m “first commit”
git remote add origin
git@github.com:wangchunwei/shulan.git
git push -u origin master

[算法]找数组中和为定值的数组对

一道简单的算法题,要求在数组中,找到所有和为定值的数组对。比如在array(11,11,1,2,-1,3,4,6,7,8,9,5,-1)中,找到所有和为10的数组对。
考虑到时间复杂度,牺牲空间,每个值作为一个key,他的互补对为value-key,每遍历一个数组值,先判断有没有互补对,有则打印此key,和互补key,互补key-1,否则添加一个key.php代码如下:

&lt;?php  
function findSum($arr, $sum) {  
    $total  = 0;  
    $sumArr = array();  
    foreach($arr as $key) {  
        //如果有此key,并且有和为sum的key,总数加一,失去一个互补key  
        if(isset($sumArr[$sum-$key]) &amp;&amp; ($sumArr[$sum-$key] &gt; 0)) {  
            $total ++ ;  
            //打印出来  
            $diff = $sum-$key;  
            echo &quot;($key, $diff)&lt;/br&gt;&quot;;  
            //互补key -1 
            $sumArr[$sum-$key] --;  
        }else{  
            //添加一个key  
            isset($sumArr[$key]) ?  $sumArr[$key]++ : ($sumArr[$key] = 1);  
        }  
    }  
    echo &quot;total:{$total}&quot;;  
}  
//测试用例  
$arr = array(11,11,1,2,-1,3,4,6,7,8,9,5,-1);  
findSum($arr, 10);  

测试结果为:
(-1, 11)
(6, 4)
(7, 3)
(8, 2)
(9, 1)
(-1, 11)
total:6