[备忘]Nginx的Rewrite重写规则(1 位领导批示)

Nginx Rewrite规则相关指令

1
2
3
4
5
6
7
8
9
10
11
12
13
    Nginx Rewrite规则相关指令有if、rewrite、set、return、break等,其中rewrite是最关键的指令。一个简单的Nginx Rewrite规则语法如下:
 
    rewrite ^/b/(.*)\.html /play.php?video=$1 break;
 
    如果加上if语句,示例如下:
 
    if (!-f $request_filename)
 
    {
 
    rewrite ^/img/(.*)$ /site/$host/images/$1 last;
 
    }

Nginx与Apache的Rewrite规则实例对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    简单的Nginx和Apache 重写规则区别不大,基本上能够完全兼容。例如:
 
    Apache Rewrite 规则:
 
    RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]
 
    RewriteRule ^/ceshi/$ /zl/ceshi.php [L]
 
    RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L]
 
    RewriteRule ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 [L]
 
    Nginx Rewrite 规则:
 
    rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;
 
    rewrite ^/ceshi/$ /zl/ceshi.php last;
 
    rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;
 
    rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;
 
    由以上示例可以看出,Apache的Rewrite规则改为Nginx的Rewrite规则,其实很简单:Apache的RewriteRule指令换成Nginx的rewrite指令,Apache的[L]标记换成Nginx的last标记,中间的内容不变。
 
    如果Apache的Rewrite规则改为Nginx的Rewrite规则后,使用nginx -t命令检查发现nginx.conf配置文件有语法错误,那么可以尝试给条件加上引号。例如一下的Nginx Rewrite规则会报语法错误:
 
    rewrite  ^/([0-9]{5}).html$ /x.jsp?id=$1  last;
 
    加上引号就正确了:
    rewrite  “^/([0-9]{5}).html$” /x.jsp?id=$1  last;
 
    Apache与Nginx的Rewrite规则在URL跳转时有细微的区别:
 
    Apache Rewrite 规则:
    RewriteRule  ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]
 
    Nginx Rewrite 规则:
    rewrite  ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/  permanent;
 
    以上示例中,我们注意到,Nginx Rewrite 规则的置换串中增加了“http://$host”,这是在Nginx中要求的。
 
    另外,Apache与Nginx的Rewrite规则在变量名称方面也有区别,例如:
 
    Apache Rewrite 规则:
    RewriteRule  ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST}  [L]
 
    Nginx Rewrite 规则:
    rewrite  ^/user/login/$ /user/login.php?login=1&forward=http://$host   last;
 
    Apache与Nginx Rewrite 规则的一些功能相同或类似的指令、标记对应关系:
 
    Apache的RewriteCond指令对应Nginx的if指令;
    Apache的RewriteRule指令对应Nginx的rewrite指令;
    Apache的[R]标记对应Nginx的redirect标记;
    Apache的[P]标记对应Nginx的last标记;
    Apache的[R,L]标记对应Nginx的redirect标记;
    Apache的[P,L]标记对应Nginx的last标记;
    Apache的[PT,L]标记对应Nginx的last标记;
 
    允许指定的域名访问本站,其他域名一律跳转到http://www.aaa.com
 
    Apache Rewrite 规则:
    RewriteCond %{HTTP_HOST}    ^(.*?)\.domain\.com$
    RewriteCond %{HTTP_HOST}    !^qita\.domain\.com$
    RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f
    RewriteRule ^/wu/$ /market/%1/index.htm [L]
 
    Nginx的if指令不支持嵌套,也不支持AND、OR等多条件匹配,相比于Apache的RewriteCond,显得麻烦一些,但是,我们可以通过下一页的Nginx配置写法来实现这个示例:
 
    Nginx Rewrite 规则:
    if ($host ~* ^(.*?)\.domain\.com$)
    {
    set $var_wupin_city $1;
    set $var_wupin ‘1′;
    }
    if ($host ~* ^qita\.domain\.com$)
    {
    set $var_wupin ‘0′;
    }
    if (!-f $document_root/market/$var_wupin_city/index.htm)
    {
    set $var_wupin ‘0′;
    }
    if ($var_wupin ~ ‘1′)
    {
    rewrite ^/wu/$ /market/$var_wupin_city/index.htm last;
    }

原文地址: http://i.echohi.com/20.html

Tags : ,

QQ校友大学数据采集程序(0 位领导批示)

最近需要用到这方面的数据.简单写了一下.将QQ校友中中国大学全部采集下来.
部分代码需要根据实际情况进行修改(如数据写入部分.我用的zwFrame框架自带方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<?php
/**
 * 采集QQ校友学校数据
 *
 * @package zWFrame
 */
 
// ####################### SET PHP ENVIRONMENT ###########################
error_reporting(E_ALL & ~E_NOTICE);
 
// #################### DEFINE IMPORTANT CONSTANTS #######################
define('THIS_SCRIPT', 'qqschools');
 
// ######################### REQUIRE BACK-END ############################
require_once ('./global.php');
set_time_limit(0);
 
/**
 *  采集链接 
 *  大学: http://api.pengyou.qq.com/index.php?mod=school&act=selector&schooltype=0&country=0&province=11&prefix=B
 */
 
$prefixs = range('A', 'Z');
$areas = range(11, 82);
 
foreach ($areas as $area)
{
	$sql = array();
	foreach ($prefixs as $prefix)
	{
		$html = '';
		$html = file_get_contents("http://api.pengyou.qq.com/index.php?mod=school&act=selector&schooltype=0&country=0&province={$area}&prefix={$prefix}");
		preg_match_all("#javascript:choose_school\((\d+),\'([^\']+)\'\)#i", $html, $schools);
		unset($html);
 
		if (!empty($schools[2]))
		{
			foreach ($schools[2] as $key => $value)
			{
				$sql[] = "('{$area}0000', '{$value}', 0, '{$prefix}')";
			}
		}
	}
	unset($schools);
 
	if (!empty($sql))
	{
		ob_end_clean();
		// 写入数据库
		$query = "INSERT INTO schools (areaid, schoolname, schooltype, prefix) VALUES " . implode(',', $sql);
		$zwframe->db->query_write($query);
		echo "{$area}0000 地区的大学数据导入完成...<br />";
		unset($sql, $query);
		flush();
		sleep(1);
	}
}
?>

PHP大图生成缩略图(0 位领导批示)

原贴地址: http://bbs.blueidea.com/thread-2997569-1-1.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
/**
* 生成缩略图
*
* @param string $imagePath 图片路径
* @param string $thumb 生成缩略图名称
* @param integer $width 生成缩略图最大宽度
* @param integer $height 生成缩略图最大高度
* 
* @author Silver 
* @link http://www.zdyi.com
*/
function resizeImage($imagePath, $thumb, $width = 200, $height = 200)
{
    list($imageWidth, $imageHeight) = getimagesize($imagePath);
    $imagePath = imagecreatefromjpeg($imagePath);
    if ($width && ($imageWidth < $imageHeight))
    {
        $width = ($height / $imageHeight) * $imageWidth;
    }
    else
    {
        $height = ($width / $imageWidth) * $imageHeight;
    }
    $image = imagecreatetruecolor($width, $height);
    imagecopyresampled($image, $imagePath, 0, 0, 0, 0, $width, $height, $imageWidth, $imageHeight);
    imagepng($image, $thumb);
    imagedestroy($image);
}
resizeImage('test.jpg', 'test_thumb.jpg');
?>

[备忘]表单提交用二进制上传时无法使用$_REQUEST得到数据(5 位领导批示)

上传文件时需要声明是以二进制数据上传 (enctype=”multipart/form-data”). 而以二进制数据上传时$_REQUEST是获取不到input等值.(file是可以获取到)

避免的方法就是使用 $_POST 或是 $_GET 方式获取

P.S.好吧. 我最近很懒.

随机数生成概率一解(3 位领导批示)

比较常见的方面是把随机数生成为一个数组. 不过随机数比较多的情况下产生的数组也会特别大.

下面是另一种算法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$array = array(1 => 30, 2 => 20, 3 => 20, 4 => 15, 5=> 10 , 6 => 5);
$rand = mt_rand();
$rand = $rand % 101;
$max = 0;
$v = 0;
foreach($array as $key => $value)
{
    $max += $value;
    if($rand <= $max)
    {
        $v = $key;
        break;
    }
}
echo $v;

PHP 求出3个坐标间的角度(1 位领导批示)

原题地址: http://bbs.blueidea.com/viewthread.php?tid=2982704

先计算 AC 的弧度, 然后将弧度转换为角度.

1
2
3
4
5
6
<?php
$a = array('x' => 50, 'y' => 60);
$b = array('x' => 80, 'y' => 60);
$c = array('x' => 80, 'y' => 70);
echo rad2deg(atan2($c['y'] - $a['y'], $c['x'] - $a['x']));
?>
Tags : ,

放出腾迅微博邀请码一枚(4 位领导批示)

放出腾迅微博邀请码一枚 拿到的朋友请回复一下.

http://t.qq.com/invite/1385974e

[备忘]MySQL记录货币建议使用DECIMAL类型(2 位领导批示)

DECIMAL和NUMERIC其实是视为相同的类型. 值是作为字符串存储, 而不是作为二进制浮点数. 这样就避免了FLOAT类型计算时出现的错误.

2010年 为了地球关灯一小时(6 位领导批示)

2010年3月27日,星期六,20:30 - 21:30
行动起来,关灯一小时,应对气候变化

earth_hour_2010_poster

全文阅读 »

[备忘]一个常用分页类(0 位领导批示)

工作经常会用到的一个分页类..记录一下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
/**
Example: 
 
$page = (isset($this->params['named']['page'])) ? $this->params['named']['page'] : 1;
// 导入分页类
App::import('Vendor', 'page_class');
// 获取公告总数
$total = $this->Bulletin->getBulletinTotal();
$perpage = ITEMPREPAGE;
$offset = $perpage * ($page - 1);
$pagebar = new Pagebar($total, $page, $offset, $perpage);
$pagenav = $pagebar->construct_page_nav($total, $page, SYSTEMURL . '/bulletins/index', null, null);
*/
 
<?php
class Pagebar
{
 
    var $perpage = 20;
	/**
	* Ensures that the variables for a multi-page display are sane
	*
	* @param	integer	Total number of items to be displayed
	* @param	integer	(ref) Current page number
	* @param	integer	(ref) Desired number of results to show per-page
	*/
	function Pagebar($numresults, &$page, &$limitlower, $perpage)
	{
		$this->perpage = $perpage;
 
		$numpages = ceil($numresults / $this->perpage);
		if ($numpages == 0)
		{
			$numpages = 1;
		}
 
		if ($page < 1)
		{
			$page = 1;
		}
		else if ($page > $numpages)
		{
			$page = $numpages;
		}
 
		$limitlower = ($page - 1) * $this->perpage;
		$limitupper = ($page) * $this->perpage;
 
		if ($limitupper > $numresults)
		{
			$limitupper = $numresults;
			if ($limitlower > $numresults)
			{
				$limitlower = ($numresults - $this->perpage) - 1;
			}
		}
		if ($limitlower < 0)
		{
			$limitlower = 0;
		}
	}
 
	/**
	* Returns the HTML for multi-page navigation
	*
	* @param	integer	Total number of items found
	* @param	integer	Page number being displayed
	* @param	string	Base address for links eg: q.php?t=99{&page=4}
	* @param	string	Ending portion of address for links
	*
	* @return	string	Page navigation HTML
	*/
	function construct_page_nav($results, $pagenumber, $address, $address2 = '', $option = array())
	{
		$perpage = $this->perpage;
 
		$show = array();
		$curpage = 0;
		$pagenav = '';
		$firstlink = '';
		$prevlink = '';
		$lastlink = '';
		$nextlink = '';
 
		if ($results <= $perpage)
		{
			$show['pagenav'] = false;
			return '';
		}
 
		$show['pagenav'] = true;
 
		$total = number_format($results);
		$totalpages = ceil($results / $perpage);
 
		$show['prev'] = false;
		$show['next'] = false;
		$show['first'] = false;
		$show['last'] = false;
 
		if ($pagenumber > 1)
		{
			$prevpage = $pagenumber - 1;
			$prevnumbers = $this->fetch_start_end_total_array($prevpage, $perpage, $results);
			$show['prev'] = true;
		}
		if ($pagenumber < $totalpages)
		{
			$nextpage = $pagenumber + 1;
			$nextnumbers = $this->fetch_start_end_total_array($nextpage, $perpage, $results);
			$show['next'] = true;
		}
 
		// create array of possible relative links that we might have (eg. +10, +20, +50, etc.)
		$pagenavsarr = array(10, 50, 100, 500, 1000);
 
		$pagenavpages = 5;
 
		while ($curpage++ < $totalpages)
		{
			if (abs($curpage - $pagenumber) >= $pagenavpages AND $pagenavpages != 0)
			{
				if ($curpage == 1)
				{
					$firstnumbers = $this->fetch_start_end_total_array(1, $perpage, $results);
					$show['first'] = true;
				}
				if ($curpage == $totalpages)
				{
					$lastnumbers = $this->fetch_start_end_total_array($totalpages, $perpage, $results);
					$show['last'] = true;
				}
				// generate relative links (eg. +10,etc).
				if (in_array(abs($curpage - $pagenumber), $pagenavsarr) AND $curpage != 1 AND $curpage != $totalpages)
				{
					$pagenumbers = $this->fetch_start_end_total_array($curpage, $perpage, $results);
					$relpage = $curpage - $pagenumber;
 
					if ($relpage > 0)
					{
						$relpage = '+' . $relpage;
					}
 
					$pagenav .= "<a onclick=\"$option[onclick]\" class=\"smallfont\" href=\"$address". "/page:$curpage". ($address2 ? '?'.$address2 : '') . "\" title=\"显示结果从 $pagenumbers[first]$pagenumbers[last] 共计 $total\"><!--$relpage--> $curpage </a>";
				}
			}
			else
			{
				if ($curpage == $pagenumber)
				{
					$numbers = $this->fetch_start_end_total_array($curpage, $perpage, $results);
					$pagenav .= "	<span class=\"smallfont\" title=\"显示结果从 $numbers[first]$numbers[last] 共计 $total\"><strong> $curpage </strong></span>";
				}
				else
				{
					$pagenumbers = $this->fetch_start_end_total_array($curpage, $perpage, $results);
					$pagenav .= "<a onclick=\"$option[onclick]\" class=\"smallfont\" href=\"$address". "/page:$curpage". (($address2) ? '?'.$address2 : '') . "\" title=\"显示结果从 $pagenumbers[first]$pagenumbers[last] 共计 $total\"> $curpage </a>";
				}
			}
		}
        $pagenav = "
                <span class=\"disabled\">
                ".(($show['prev']) ? ("<a onclick=\"$option[onclick]\" class=\"smallfont\" href=\"$address".("/page:$prevpage".($address2 ? '?'.$address2 : ''))."\" title=\"上一页 - 结果从 $prevnumbers[first]$prevnumbers[last] 共计 $total\">上一页</a></span>") : ("上一页</span>"))."
 
                $pagenav
 
                ".(($show['next']) ? ("<span><a onclick=\"$option[onclick]\" class=\"smallfont\" href=\"$address/page:$nextpage".($address2 ? '?'.$address2 : '')."\" title=\"下一页 - 结果从 $nextnumbers[first]$nextnumbers[last] 共计 $total\">下一页</a></span>") : ("<span>下一页</span>"))."
 
				<span>第 $pagenumber / $totalpages 页,共 <strong>$total</strong>条记录</span>";
		return $pagenav;
	}
	/**
	* Returns an array so you can print 'Showing results $arr[first] to $arr[last] of $totalresults'
	*
	* @param	integer	Current page number
	* @param	integer	Results to show per-page
	* @param	integer	Total results found
	*
	* @return	array	In the format of - array('first' => x, 'last' => y)
	*/
	function fetch_start_end_total_array($pagenumber, $perpage, $total)
	{
		$first = $perpage * ($pagenumber - 1);
		$last = $first + $perpage;
 
		if ($last > $total)
		{
			$last = $total;
		}
		$first++;
 
		return array('first' => number_format($first), 'last' => number_format($last));
	}
}
?>
Tags : ,

随机显示的10篇日志

评论最多的10篇日志

浏览最多的10篇日志