加密和验证加密的函数

没有评论

2010 年 11 月 30 日 at 上午 9:46分类:PHP

<?php
define('ST_SALT_LENGTH',15);
//==========================================================
function do_hash($string, $salt = NULL)          //加密函数
{
if(null === $salt)
{
$salt = substr(md5(uniqid(rand(), true)), 0, ST_SALT_LENGTH);
}
else
{
$salt = substr($salt, 0, ST_SALT_LENGTH);
}
return $salt . md5($salt . $string);
}
//=========================================================
function check_hash($source, $target)         //验证加密的字符串是否于源字符串相等
{
return do_hash($source, $target) == $target;
}
//=========================================================
//echo do_hash('binbin');
echo check_hash('binbin','d1665ad593dc0bc1b3f6b36c64163f6fe68d204a36be3e6')?'TRUE':'FALSE';

php的内置变量 DIRECTORY_SEPARATOR 说明

没有评论

2010 年 11 月 26 日 at 下午 5:30分类:PHP

php的内置变量DIRECTORY_SEPARATOR是一个显示系统分隔符的命令,DIRECTORY_SEPARATOR是php的内部常量,不需要任何定义与包含即可直接使用。

众所周知,在windows下路径分隔符是\(当然/在部分系统上也是可以正常运行的,微软的操作系统是够人性化呢?还是够不精密的呢?),在linux上路径的分隔符是/,这就导致了一个问题,比如你的开发机器是windows,你有一个图片上传程序,你在你的调试机器上指定的上传文件保存目录是:

define('BLOGGUY.CN_ROOT', dirname(__FILE__)."/upload"),

在本地调试都很正常,可是上传到linux服务器的时候你会发现会出错。

是的,许多网站就是这么经历过的,当初折腾得个半死,所以印象比较深刻。

这个问题就是出在文件的分隔符上,windows上我们习惯性的使用/作为文件分隔符,但是在linux上人家是不认识这个标识的,人家只认识/,于是就要引入下面这个php内置变量了:DIRECTORY_SEPARATOR。

上面的写法可以改写为以下无错写法:

define('BLOGGUY.CN_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR."upload");

这样就可以确保不会出错了。

例如discuz里面是这样写的:

define('S_ROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);

回到问题本身上,DIRECTORY_SEPARATOR是一个返回跟操作系统相关的路径分隔符的php内置命令,在windows上返回/,而在linux或者类unix上反悔/,就是这么个区别,通常在定义包含文件路径或者上传保存目录的时候会用到。

请再看看下面这个例子:
const DIR_SEP = DIRECTORY_SEPARATOR;// 路径分割 win下\ linux下/

private function __construct()
{
$this-&gt;_options = array(
'template_dir' =&gt; 'templates' . self::DIR_SEP, //模板文件所在目录
'cache_dir' =&gt; 'templates' . self::DIR_SEP . 'cache' . self::DIR_SEP, //缓存文件存放目录
'auto_update' =&gt; false, //当模板文件改动时是否重新生成缓存
'cache_lifetime' =&gt; 0, //缓存生命周期(分钟),为 0 表示永久
'suffix' =&gt; '.html', //模板文件后缀
);
}

TP隐藏了网站的入口文件index.php

没有评论

2010 年 11 月 19 日 at 上午 8:30分类:CSS | PHP

今天使用伪静态将网站的入口文件index.php隐藏起来了,按照thinkphp官方手册上面讲的方法,我试了N次都没有成功,我也找不出是什么原因,最后实在没得办法只得自己手动一条一条的写.htaccess文件里面的规则,但是当我上传到虚拟主机上面去的时候发现,还是没有效果index.php文件依然没有隐藏,然后问了主机提供商,他们讲iis是不支持.htaccess文件的,iis只支持httpd.ini,然后又将.htaccess修改成httpd.ini文件。

值得注意的是.htaccess与httpd.ini之间的规则还是有些区别的,如果伪静态的文件不对还可能会出现错误500或错误404。

以下是我的httpd.ini文件中的两条
[ISAPI_Rewrite]
RewriteRule /Index/index/p/([0-9]+)/ /index.php/Index/index/p/$1
RewriteRule /blog/([0-9]+) /index.php/blog/$1

对应的.htaccess的规则则是

RewriteRule ^/blog/([0-9]+)$ /index.php/blog/$1

我在网上查找了一些资料,有的资料讲httpd.ini的文件中的特殊字符必须要转义才可以,但是我的没有转义也可以,不知道是不是服务器上面的伪静态软件的版本的问题。

详解Apache下.htaccess文件的8个用法

没有评论

2010 年 11 月 15 日 at 下午 7:48分类:WEB开发

.htaccess文件允许我们针对特定目录及其子目录修改一些服务器设置,虽然这种类型的配置最好是在服务器本身配置文件的小节部分处理,但有时我们根本没有权限访问这个配置文件,尤其是当我们在一台共享的托管主机上,大多数共享主机服务商只允许我们以.htaccess方式来改变服务器的行为。

.htaccess文件是一个简单的文本文件,注意文件名前的“.”很重要,我们可以用自己喜欢的文本编辑器编辑它,然后上传到我们的服务器,将其放在我们想要改变服务器默认行为的目录下。

通过.htaccess文件我们可以做的事包括:为文件夹设置密码保护,创建重定向,调整PHP设置,控制文件缓存,控制服务器如何处理扩展名(例如,我们可以让一个HTML文件通过PHP模块运行,而不是简单的通过Web服务器解析它),以及改变文件返回给访问者的方式。下面我开始介绍这个文件最常见的8种用法。

1、禁止对无索引文件的目录进行文件列表展示

默认情况下,当我们访问网站的某个无索引文件(如index.html,index.htm或index.php)目录时,服务器会显示该目录的文件和子目录列表,这是非常危险的,因为它可能暴露网站的内部结构,也许不小心就将含有敏感信息的文件公之于众了,为了禁止这种行为,我们可以在网站根目录创建一个.htaccess文件,内容如下:

Options –Indexes

2、创建重定向或改变丢失文件的响应状态

当我们从服务器请求一个找不到的文件时,默认情况下服务器会返回404状态码,浏览器和访问者便知道URL指定的位置找不到该文件,但这是一个通用的消息,没有太大的实际意义,我们希望告诉浏览器和访问者更多有用的信息,如:

◆文件被永久移走

状态码301告诉浏览器文件已经被永久移动到另一个位置,这样我们就可以通过.htaccess文件实现重定向了,例如,使用下面的代码可以将浏览器重定向到新的地址:

Redirect 301 /path/from/htaccess/file.html http://www.php100.com/path/file.html

◆文件被暂时移走

状态码307告诉浏览器文件已经被移走,但这是暂时的,浏览器接收到301状态码时就会访问新地址,但不用改变文件的链接,也不会为新地址创建缓存(除非它受Cache-Control或过期头信息字段控制),浏览器每次都会继续请求源地址。

Redirect 307 /path/from/htaccess/file.html http://www.php100.com/path/file.html

◆文件不存在

状态码410告诉浏览器,它请求的文件已经从服务器上永久删除,和404不一样,404仅仅表示文件不在这里的意思,而410表示文件不仅不在这里,在其它地方也没有。

Redirect 410 /path/from/htaccess/file.html

3、创建自定义错误响应页面

如果不向浏览器返回状态码,我们可以创建自己的错误页面,我们可以创建一个自定义错误页面,例如,对于401状态码我们可以创建一个未经授权的错误页面,对于404状态码,我们可以创建一个未找到错误页面,我们需要做的就是修改.htaccess文件,添加下面两行代码:

ErrorDocument 401 /path/to/401.html
ErrorDocument 404 /path/to/404.html

4、给不同类型的文件设置缓存过期时间

这个设置告诉浏览器保持文件的缓存多长时间,在未过期前,访问该文件时就不用向服务器发起请求了,服务器向浏览器返回文件时,会附加上一个Expires头信息。

我们可以使用ExpiresDefault指令后面跟一个基础时间+时间长度设置文件的默认过期时间,使用ExpiresByType指令后面跟一个文件类型+基础时间+时间长度指定特定文件类型的过期时间。

基础时间可以是访问时间,它从浏览器请求该文件时开始计数,也可以是修改时间,它从文件最后一次修改时间开始计数,注意,如果你使用修改时间,返回给浏览器的动态内容不会加上Expires头,如动态生成的图像,因为非已存在的文件不存在修改时间。

过期时间要和基础时间结合使用,通过添加一个plus和一个时间,这个时间可以给出年、月、日,时、分、秒,如果我们只使用一个单位,可以使用单数表示,例如,我们可以指定它为“1分钟”或“10分钟”。

在下面的例子中,我使用ExpiresDefault指令将所有文件的默认过期时间设为1天,然后使用ExpiresByType指令为不同文件类型指定过期时间。

&lt;ifModule mod_expires.c&gt;
ExpiresActive On
ExpiresDefault "access plus 1 day"
ExpiresByType image/png "access plus 30 days"
ExpiresByType image/jpeg "access plus 4 weeks"
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
ExpiresByType application/javascript "modification plus 2 weeks"
ExpiresByType text/css "modification plus 14 days"
&lt;/ifModule&gt;

5、文件发送到浏览器之前先压缩

任何现代浏览器都能处理服务器压缩过的文件,这样做也是为了减少页面的载入时间,如果服务器默认没有开启文件压缩功能,我们可以通过.htaccess文件来开启。

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-javascript application/rss+xml application/atom_xml text/javascript

注意,我这里没有为图像文件开启压缩,因为我们的图像文件已经通过其它压缩技术处理好了。

6、给文件夹设置密码保护

为了保护含有敏感数据的特殊文件夹,我们需要创建一个包含有效的用户名和密码的文件,然后在.htaccess文件中添加一些设置,但用户名和密码仍然是以明文形式发送到服务器的,因此很容易受到中间人攻击,除非我们使用SSL。

首先,我们创建一个名为.htpasswd的文件,将权限修改为600(只有文件所有者有读写权),这样其他用户才不能访问。

touch .htpasswd
chmod 600 .htpasswd

创建好文件后,我们需要向这个文件注入用户名和密码,如果你使用Linux或Unix类操作系统,使用htpasswd命令就可以办到,如果你能通过SSH登陆到你的服务器,那么你可以使用htpasswd管理.htpasswd文件中的用户名和密码,如果不行,还有很多在线工具(如http://www.htaccesstools.com/htpasswd-generator/)可以帮助你生成.htpasswd文件中使用的密码。

使用下面的命令可以向这个文件中注入用户名和密码:

htpasswd [passwd file] [user]

如:

htpasswd .htpasswd juan

它会提示你输入密码,然后他会加密密码并保存到.htpasswd文件中。如果Apache是安装在除Windows,Netware和TPF(一种IBM大型机)外的任何系统上,默认情况下下,它会调用crypt()函数加密密码。使用这个命令我们可以创建多个用户,并可以修改已有用户的密码,你可以使用-n参数获得加密后的密码字符串值。

htpasswd -n juan

它会返回类似下面这样的字符串:

juan:n94xSo6uSwhCY

然后用文本编辑器打开.htpasswd文件,将上面返回的内容粘贴到文件中,每行代表一个用户。

还可以使用-m参数调用md5加密方法加密密码,在Windows,Netware和TPF下,默认就使用的是md5加密,也可以适应-s参数调用SHA加密,使用-d参数告诉命令调用crypt函数,在大多数系统上,这也是默认的行为。

如果文件不存在,则添加-c参数,它会创建文件,如果文件已经存在,添加这个参数后就会重写整个文件,只留下新创建的用户,如果想删除.htpasswd文件中的某个用户,使用-D参数。

最后,我们可以和其它命令结合使用,如果加入参数-b,我们可以直接在命令中加上密码,但这样做是不安全的。

htpasswd .htpasswd juan randompassword

创建好用户后,他们就可以访问这个目录及其子目录了,但我们还需要在要保护的文件夹下添加一个.htaccess文件,内容如下:

AuthName "Please authenticate in order to access the contents of this folder"
AuthType Basic
AuthUserFile /full/path/to/.htpasswd
Require valid-user

这里的AuthName指的是要求你输入用户名和密码时的提示信息,AuthType表示需要的认证类型,在这个例子中,我只想弹出一个对话框,要求输入用户名和密码,因此设置为Basic,AuthUserFile指的是保存用户名和密码的文件位置,在这个例子中指的是.htpasswd文件,位置和我们的.htaccess文件相同,Require valid-user指定只有.htpasswd文件包含的合法用户才能访问。

7、将HTML文件当PHP文件使

为了将html扩展名文件当作php文件使用,需要在.htaccess文件中添加下面的内容:

AddType application/x-httpd-php .htm
AddType application/x-httpd-php .html

这样服务器就会把HTML文件作为PHP文件进行解析。

8、修改PHP设置

如果我们不能访问php.ini文件,有些主机服务商允许我们修改.htaccess文件来改变一些PHP设置,例如,我想生成所上传图片的缩略图,有些主机服务商默认将PHP的内存限制为2MB,显然要生成缩略图是不够用的,因此我要将这个限制改大一点,如增加到16MB,如果要移除内存限制,可以将其设为-1。

为了在.htaccess文件中修改PHP设置,服务器必须启用了AllowOverride Options(或AllowOverride all)选项,如果那样,我们只需要在.htaccess文件中添加下面一行命令即可:

php_value memory_limit 16M

正则表达式助记口诀

没有评论

2010 年 11 月 12 日 at 下午 11:32分类:WEB开发

正则是每个程序员绕不开的堡垒,只有把它攻下来。我觉得正则之所以难,第一难是需要记忆,第二难是要求具备抽象逻辑思维。
签于网上太多的介绍都是一篇凶悍的短文,边看边理解可以,帮助记忆不行。又受五笔字型字根表口诀“白手看头三二斤…”的启发,试作“正则表达式助记口诀”又名“正则打油诗”,版本0.1,绝对原创,仿冒必究,:)本文仅为学习正则时为了便于记忆而作,不能代替系统而全面的学习过程,错漏之处,敬请指正!

正则其实也势利,削尖头来把钱揣;  (指开始符号^和结尾符号$)
特殊符号认不了,弄个倒杠来引路;  (指\. \*等特殊符号)
倒杠后面跟小w, 数字字母来表示;  (\w跟数字字母;\d跟数字)
倒杠后面跟小d, 只有数字来表示;
倒杠后面跟小a, 报警符号嘀一声;
倒杠后面跟小b, 单词分界或退格;
倒杠后面跟小t, 制表符号很明了;
倒杠后面跟小r, 回车符号知道了;
倒杠后面跟小s, 空格符号很重要;

小写跟罢跟大写,多得实在不得了;
倒杠后面跟大W, 字母数字靠边站;
倒杠后面跟大S, 空白也就靠边站;
倒杠后面跟大D, 数字从此靠边站;
倒框后面跟大B, 不含开头和结尾;

单个字符要重复,三个符号来帮忙;   (* + ?)
0 星加1 到无穷,问号只管0 和1;   (*表0-n;+表1-n;?表0-1次重复)
花括号里学问多,重复操作能力强;   ({n} {n,} {n,m})
若要重复字符串,园括把它括起来;   ((abc){3} 表示字符串“abc”重复3次 )
特殊集合自定义,中括号来帮你忙;   转义符号行不通,一个一个来排队;

实在多得排不下,横杠请来帮个忙;   ([1-5])
尖头放进中括号,反义定义威力大;   ([^a]指除“a”外的任意字符 )
竖作用可不小,两边正则互替换;    (键盘上与“\”是同一个键)
竖能用很多次,复杂定义很方便;

园括号,用途多;
反向引用指定组,数字排符对应它;   (“\b(\w+)\b\s+\1\b”中的数字“1”引用前面的“(\w+)”)
支持组名自定义,问号加上尖括号;   (“(?<Word>\w+)”中把“\w+”定义为组,组名为“Word”)
园括号,用途多,位置指定全靠它;
问号等号字符串,定位字符串前面;   (“\b\w+(?=ing\b)”定位“ing”前面的字符串)
若要定位串后面,中间插个小于号;   (“(?<=\bsub)\w+\b”定位“sub”后面的字符串)
问号加个惊叹号,后面跟串字符串;PHPer都知道,  !是取反的意思;
后面不跟这一串,统统符合来报到;   (“\w*d(?!og)\w*”,“dog”不符合,“do”符合)
问号小于惊叹号,后面跟串字符串;
前面不放这一串,统统符合来报到;
点号星号很贪婪,加个问号不贪婪;
加号问号有保底,至少重复一次多;
两个问号老规矩,0次1次团团转;
花括号后跟个?,贪婪变成不贪婪

Nginx关于虚拟主机的配置

没有评论

2010 年 11 月 12 日 at 下午 11:09分类:Nginx

Nginx首先决定一个过来的请求由哪一个server来处理。

就是:我们打开HttpWatch看到的那个HOST值。

server {

listen       80;

server_name  nginx.org  www.nginx.org;

...

}

server {

listen       80;

server_name  nginx.net  www.nginx.net;

...

}

server {

listen       80;

server_name  nginx.com  www.nginx.com;

...

}

这样的话我们就可以配置三个域名。即同一个IP绑定三个域名。如果发现有一个域名均不匹配的话就定义出来一个默认的域名

server {

listen       80 default_server;

server_name  nginx.net  www.nginx.net;

...

}

对于这种域名我们可以这样来处理

server {

listen       80 default_server;

server_name  <a href="http://www.nginx.net/">www.nginx.net</a>;     //这个值你得填写一个

return      444;

}

基于域名与IP混用的虚拟主机

server {

listen       192.168.1.1:80;

server_name  nginx.org  www.nginx.org;

...

}

server {

listen       192.168.1.1:80;

server_name  nginx.net  www.nginx.net;

...

}

server {

listen       192.168.1.2:80;

server_name  nginx.com  www.nginx.com;

...

}

至此配置完成了有关虚拟机的配置工作!

示例:

Server {

Listen          80;

Server_name     nginx.org   <a href="http://www.nginx.org/">www.nginx.org</a>;

Root            /data/www;      //这个有点相当于resin里面的root目录

Location    / {

Index   index.html  index.php;

}

Location ~*\.(gif|jpg|png)$ {

Expires 30d;

}

Location ~\.php$ {

fastcgi_pass   localhost:9000;

fastcgi_param  SCRIPT_FILENAME

$document_root$fastcgi_script_name;

include        fastcgi_params;

}

}

其中的location为”/” 表示的是它可以匹配任何请求的。

哦!原来location是用来检验URI的!

心得与笔记:

我们的server是配置HOST的即主机。

Location是配置URI的。

比如:http://www.sina.cn/blog/index.php  那这里面的HOST就是www.sina.cn

URI就是我们的/blog/index.php值了。

一个“/logo.gif”请求会先和字符location“/”匹配,然后再和正则表达式“\.(gif|jpg|png)$”匹配, 因此,它是被字符location处理的。指令“root /data/www”会使该请求指向一个文件 “/data/www/logo.gif”,之后这个文件就会发送到客户端。

哦原来root的作用其实与resin里面的document-root是一个概念的!

一个 “/index.php”请求同样先被字符location “/” 匹配,然后才被正则表达式“\.(php)$”匹配。 所以, 它是被字符location所处理的,并且这请求是通过一个监听在localhost:9000的FastCGI server被处理的. “fastcgi_param” 指令设置FastCGI的参数SCRIPT_FILENAME设置为“/data/www/index.php”, FastCGI server 执行这个文件. $document_root 变量的值等于 “root” 指令,$fastcgi_script_name 变量等于 URI 请求的值, 也就是 “/index.php”.

笔记:nginx是让客户端程序找到文件的目录位置。具体如何处理这个得让后端来处理的

一个 “/about.html”请求只被字符location“/”匹配, 所以,它被这个location处理。 使用“root /data/www” 指令的时候,该请求会被转到 “/data/www/about.html”, 并且文件会被发送到客户端。

明白了!

笔记:location是得讲个先后顺序才行的。即先由 location / 处理让客户端找到所需要的文件。然后再往下找看看是否还有匹配的location项如果像php文件就会有了!

丢给了一个FAST-CGI处理程序

总结:

心得与笔记:

我们的server是配置HOST的即主机。多个域名就定义多个虚拟主机即可

Location是配置URI的。

比如:http://www.sina.cn/blog/index.php  那这里面的HOST就是www.sina.cn

URI就是我们的/blog/index.php值了。

Location是多方匹配的。示例:

Location    / {

Index   index.html  index.php;

}

Location ~*\.(gif|jpg|png)$ {

Expires 30d;

}

如果我请求一个abc.gif的话是先由第一个UIR定位找到图片位置再由第二个URI处理得到过期时间。

当然在location里面有以下几个选项。

1、last 基本上用这个。表示已完成了rewrite不再匹配后面的规则了

2、break    中止rewrite不再继续匹配

3、redirect 返回临时重定向的HTTP状态302

4、permanent    返回永久重定向的HTTP状态301

注意:原有的URL支持正则,重写的URL不支持正则

Location    / {

Index   index.html  index.php;

Break;

}

则后面的过期限制就不生效

手工测试一下:只处理静态文件的情况

站点目录:

虚拟主机1:目录放在D:\myweb\proj3 下面

虚拟主机2:目录放在D:\myweb\proj4 下面

server {

listen 80;

server_name www.aaa.com;

root    D:\myweb\proj3;

location / {

index index.html index.htm;

}

location ~*\.(gif|jpg|png)$ {

expires  30d;

}

}

server {

listen 80;

server_name www.bbb.com;

root    D:\myweb\proj4;

location / {

index index.html index.htm;

}

location ~*\.(gif|jpg|png)$ {

expires  30d;

}

}

OK!配置了两个虚拟主机了。到时只要域名一过来就可以解析。

Nginx的Rewrite配置

2010 年 11 月 12 日 at 下午 10:03分类:Nginx

在Nginx的服务器环境中!因为该服务器不支持PATH_INFO的方式进行URL路由的的设置

因此我们启用Nginx的Rewrite模式来设置我们想要的URL模式:

具体的配置方式和Apache的配置方式是一样的!只要我们在Nginx的配置文件nginx.conf的服务(server)

里面添加相关的代码就行了,我们把配置Rewrite的规则放在43行的location里面,至于为什么放在这里,

那是因为只有在这里,匹配的时候是没有判断文件的拓展名,而在其他的location里面是有判断文件的拓展名的,

甚至有些还会对文件进行过滤!因此我们将我们的Rewrite规则放在43行处location中,当然你自己另外写一个

类似的locaton也是可以的!

一帮情况下,我们会把我们的规则放在if条件判断里面,这样子做是为了更安全,更清晰的匹配规则!

如下:

if (!-e $request_filename) {

#Nginx伪静态的配置
rewrite “^/bin-(\w*)\.html$” /index.php?a=$1 last;
break;
}

这样子一来:我们就可以用这样子的地址链接来访问index.php了
index.php中的代码:

<?
echo $_GET['a'];
 echo “<br />”;
?>

这样我们输出来的结果就是12345了
Nginx的Rewrite规则和Apache的Rewite规则差别不是很大,几乎可以直接使用。比如在Apache中这样写规则

rewrite ^/([0-9]{5}).html$ /viewthread.php?tid=$1 last;

而在Nginx中写成这样写是无法启动的,解决的办法是加上两个双引号:

rewrite “^/([0-9]{5}).html$” /viewthread.php?tid=$1 last;

同时将Apache的RewriteRule改为Nginx的Rewrite,基本就实现了Nginx的Rewrite规则到Apache的Rewite规则的转换。
Rewrite的Flags
last – 基本上都用这个Flag。
break – 中止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
Discuz!在Nginx下的Rewrite
需要说明的是,下网上以前一直流传的Rewrite都是有误的。
下面的Rewrite中百分号前面多了个转移字符“\”,这在Apache中是需要的,而在Nginx中则是不需要的。

rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&amp;amp;extra=page\%3D$3&amp;amp;page=$2 last;

正确的应该是

rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&amp;amp;extra=page%3D$3&amp;amp;page=$2 last;

这个错误在基本上目前所有使用Nginx作为服务器,并且开启了Rewrite的网站上存在。包括Discuz!官方,目前已经给cnteacher反馈了。

完整正确的Discuz!在Nginx下的Rewrite如下:

rewrite ^/archiver/((fid|tid)-[\w\-]+\.html)$ /archiver/index.php?$1 last;
rewrite ^/forum-([0-9]+)-([0-9]+)\.html$ /forumdisplay.php?fid=$1&page=$2 last;
rewrite ^/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /viewthread.php?tid=$1&amp;amp;extra=page%3D$3&amp;amp;page=$2 last;
rewrite ^/space-(username|uid)-(.+)\.html$ /space.php?$1=$2 last;
rewrite ^/tag-(.+)\.html$ /tag.php?name=$1 last;
break;

下面是一些主流程序的 Rewrite的写法:

http://www.vpser.net/manage/nginx-rewrite.html

Nginx配置文件中的一些知识点:

正则表达式匹配,其中:

* ~ 为区分大小写匹配
* ~* 为不区分大小写匹配
* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配
文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件
* -d和!-d用来判断是否存在目录
* -e和!-e用来判断是否存在文件或目录
* -x和!-x用来判断文件是否可执行
flag标记有:

* last 相当于Apache里的[L]标记,表示完成rewrite
* break 终止匹配, 不再匹配后面的规则
* redirect 返回302临时重定向 地址栏会显示跳转后的地址
* permanent 返回301永久重定向 地址栏会显示跳转后的地址
一些可用的全局变量有,可以用做条件判断(待补全)
$args
$content_length
$content_type
$document_root
$document_uri
$host
$http_user_agent
$http_cookie
$limit_rate
$request_body_file
$request_method
$remote_addr
$remote_port
$remote_user
$request_filename
$request_uri
$query_string
$scheme
$server_protocol
$server_addr
$server_name
$server_port
$uri

修改NGINX配置完美支持PATH_INFO路由模式

没有评论

2010 年 11 月 12 日 at 上午 10:17分类:Nginx | WEB开发

  1. location ~ \.php
  2. {
  3. fastcgi_index index.php;
  4. fastcgi_pass 127.0.0.1:9000;
  5. include fastcgi_params;
  6. set $path_info “”;
  7. set $real_script_name $fastcgi_script_name;
  8. if ($fastcgi_script_name ~ “^(.+?\.php)(/.+)$”) {
  9. set $real_script_name $1;
  10. set $path_info $2;
  11. }
  12. fastcgi_param SCRIPT_FILENAME /var/html/$real_script_name;
  13. fastcgi_param SCRIPT_NAME $real_script_name;
  14. fastcgi_param PATH_INFO $path_info;
  15. }
    ++++++++++++++++++++++++++++++++++++++++++++++++
  1. location ~* .*\.php($|/)
  2. {
  3. fastcgi_split_path_info ^(.+\.php)(.*)$;
  4. fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  5. fastcgi_param PATH_INFO $fastcgi_path_info;
  6. fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
  7. if ($request_filename ~* .*\.php$) {
  8. set $is_path_info ’0′;
  9. }
  10. if (-e $request_filename) {
  11. set $is_path_info ’1′;
  12. }
  13. if ($is_path_info ~ ’0′) {
  14. return 403;
  15. }
  16. }
    NGINX环境下不支持PATH_INFO导致PHP框架开发的网站不能使用解决办法
    目前大部分PHP框架都是以PATH_INFO路由模式为默认模式,但nginx默认是不支持path_info路由模式【0.7.3版前部支持PATH_INFO路由模式】,那么如何修改其配置支持PATH_INFO模式呢?

    修改NGINX配置文件,在http段或者server段加入上面所示的代码!

    修改完毕后用nginx自带的配置检测命令检测是否正确,如正确,重启nginx即可

Nginx的开机启动和PATH_INFO配置

没有评论

2010 年 11 月 11 日 at 下午 9:44分类:Nginx | PHP | WEB开发

4 制作维护脚本,并设置为开机自启动。
由 于是开发环境,所以不必添加为系统服务,只要开机能启动就可以了。
将 d:\webserver\nginx\nginx.exe 创建一个狂接方式,并添加到 开始菜单–>启动项 里面去。
这样开机nginx就启动了。
在 d:\webserver 文件夹下建立 nginx_reload.txt文件。
里面输入

d:
cd \webserver\nginx\
nginx.exe -s reload

然后修改扩展名,为nginx_reload.bat。
这样当修改虚拟主机配置后,或修改rewrite规则后,可直接双击该文件完成 nginx配置的重新加载。
而不必再在任务管理器内结束2个nginx.exe进程,再双击nginx.exe以完成重启。
php的 启动比较特殊,启动后控制台窗口会一直停留着,如果关闭控制台,或按Ctrl C ,则php-cgi.exe进程会被终止。
所以要建立一个后 台运行的vbs脚本。
在 d:\webserver 文件夹下建立一个 php.txt文件
输入

Set objShell = CreateObject("Wscript.Shell")
objShell.Run("tskill php-cgi"), 0, TRUE
objShell.Run("D:\webserver\php\php-cgi.exe -b 127.0.0.1:9000 -c D:\webserver\php\php.ini"), 0, TRUE

并改名为php.vbs
这时候双击此文件,会杀掉所有正在运行的php-cgi.exe进程,并重新启动一个php-cgi.exe进 程。
由于是开发环境,我们只启动一个php-cgi.exe进程就可以了。
将此文件创建一个快捷方式,并添加到 开始菜单–>启动项 里面去。
这样 php就开机自动启动了。
下面可以修改一下php.ini文件,和重启一下电脑测试看看 是否管用。
5 配置PATH_INFO 变量,以支持PHP框架中的URL路由。
现有的各种 php框架中,都有url路由功能,使url格式都为 http://example.com/index.php/object/action/value/
这是基于 php的全局变量 $SERVER['PATH_INFO']的。
而nginx只对 php-cgi.exe进行简单的代理,并不支持 PATH_INFO。
所以我们需要略微修改配置

打开Nginx的配置文件nginx.conf在有判断的location里面修改代码为如下:


location ~ .*\.php($|/)

{
<div id="_mcePaste">root           E:\web\www;</div>
<div id="_mcePaste">fastcgi_pass   127.0.0.1:9000;</div>
<div id="_mcePaste">fastcgi_index  index.php;</div>
<div id="_mcePaste">fastcgi_param  SCRIPT_FILENAME  E:\web\www$fastcgi_script_name;#PHP文件</div>
<div id="_mcePaste">include        fastcgi_params;</div>
<div id="_mcePaste">#配置path_info模式开始</div>
<div id="_mcePaste"><strong><span style="color: #ff0000;"> set $path_info "";</span></strong></div>
<div id="_mcePaste"><strong><span style="color: #ff0000;"> set $real_script_name $fastcgi_script_name;</span></strong></div>
<div id="_mcePaste"><strong><span style="color: #ff0000;"> if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {</span></strong></div>
<div id="_mcePaste"><strong><span style="color: #ff0000;"> set $real_script_name $1;</span></strong></div>
<div id="_mcePaste"><strong><span style="color: #ff0000;"> set $path_info $2;</span></strong></div>
<div id="_mcePaste"><strong><span style="color: #ff0000;"> }</span></strong></div>
<div id="_mcePaste"><strong><span style="color: #ff0000;"> fastcgi_param SCRIPT_NAME $real_script_name;</span></strong></div>
<div id="_mcePaste"><strong><span style="color: #ff0000;"> fastcgi_param PATH_INFO $path_info;</span></strong></div>
<div id="_mcePaste">#配置path_info模式结束</div>
}

或者:


location ~ .*\.php($|/)

{
<div id="_mcePaste">root           E:\web\www;</div>
<div id="_mcePaste">fastcgi_pass   127.0.0.1:9000;</div>
<div id="_mcePaste">fastcgi_index  index.php;</div>
<div id="_mcePaste">fastcgi_param  SCRIPT_FILENAME  E:\web\www$fastcgi_script_name;#PHP文件</div>
<div id="_mcePaste">include        fastcgi_params;</div>
<div id="_mcePaste">#配置path_info模式开始</div>
<div id="_mcePaste">
<div id="_mcePaste"><strong><span style="color: #ff0000;"> fastcgi_split_path_info ^(.*\.php)(.*)$; </span></strong></div>
<div id="_mcePaste"><strong><span style="color: #ff0000;"><span style="white-space: pre;"> </span> fastcgi_param  PATH_INFO $fastcgi_path_info;</span></strong></div>
</div>
<div id="_mcePaste">#配置path_info模式结束</div>
}

这两种方法都是可以的!!

(当然,本文中的已去掉)。
然后我们运行 d:\webserver\nginx_reload.bat。
这时 我们的nginx 就支持 url路由了。

Nginx+php的环境配置

没有评论

2010 年 11 月 11 日 at 下午 8:36分类:Nginx | PHP

步骤:

  1. 1、安装NGINX for win
  2. 2、安装PHP for win
  3. 3、安装MYSQL for win
    1. 4、安装PHPADMIN

nginx Logo 下载最新的稳定的nginx的版本

nginx的配置和运行

将Nginx配置成WINDOWS服务:

下载WINSW,建立winsw.xml,并输入内容如下:

<service>

02 <id>nginx</id>

03 <name>nginx</name>

04 <description>nginx</description>

05 <executable>c:\nginx\nginx.exe</executable>

06 <logpath>c:\nginx\</logpath>

07 <logmode>roll</logmode>

08 <depend></depend>

09 <startargument>-p c:\nginx</startargument>

10 <stopargument>-p c:\nginx -s stop</stopargument>

11 </service>

运行后将会在WINDOWS服务列表中找到NGINX服务项,将服务设置成自动启动。

修改Nginx配置文件,路径名称C:\nginx\conf://以下我nginx的配置文件内容,更详细的:http://www.javaeye.com/topic/417298

#user nobody;
worker_processes 1;

#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;

#pid        logs/nginx.pid;

events {
worker_connections 1024;
}

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

#log_format main ‘$remote_addr – $remote_user [$time_local] “$request” ‘
#                  ‘$status $body_bytes_sent “$http_referer” ‘
#                  ‘”$http_user_agent” “$http_x_forwarded_for”‘;

#access_log logs/access.log main;

sendfile        on;
#tcp_nopush     on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen       80;    #服务器监听的端口,http请求的端口
server_name localhost;       #服务器地址

#charset utf-8;       #服务处理的编码

#access_log logs/host.access.log main;

location / {
root   E:\www; #网站的根目录,相当于wamp中的www
index index.html index.htm index.php;    #默认执行的文件
autoindex on;   #当没有默认文件时,打开域名显示文件列表目录
}

#error_page 404              /404.html;

# redirect server error pages to the static page /50x.html
#
error_page   500 502 503 504 /50x.html;
location = /50x.html {
root   html;
}

# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
#    proxy_pass   http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#  这里是重点啦,要小心一下要把文件解注释掉
location ~ \.php$ {
#    root           html;         #这行不要接注释
fastcgi_pass    127.0.0.1:9000;                #fast-cgi也就是php-cgi监听地址和端口
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;     #这里要特别注意,把网站的根目录直接替换掉 /scripts 就可以,这里也可以写成 E:/www 。
include        fastcgi_params;
}

# deny access to .htaccess files, if Apache’s document root
# concurs with nginx’s one
#
#location ~ /\.ht {
#    deny all;
#}
}

# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
#    listen       8000;
#    listen       somename:8080;
#    server_name somename alias another.alias;

#    location / {
#        root   html;
#        index index.html index.htm;
#    }
#}

# HTTPS server
#
#server {
#    listen       443;
#    server_name localhost;

#    ssl                  on;
#    ssl_certificate      cert.pem;
#    ssl_certificate_key cert.key;

#    ssl_session_timeout 5m;

#    ssl_protocols SSLv2 SSLv3 TLSv1;
#    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
#    ssl_prefer_server_ciphers   on;

#    location / {
#        root   html;
#        index index.html index.htm;
#    }
#}

}

尝试加载输入测试网页在浏览器中:

http://localhost

Welcome Screen in nginx

如果你看到它,你的安装成功。如需将Nginx配置负载均衡和反向代理,请参考其它资料,本文不作详述。

Nginx的配置PHP

下载PHP最新版本,放置c:\php

一、

首先打开php.ini(修php.ini-development) 找到:
;extension=php_mysql.dll
将前面的 ; 号去掉, 改成:
extension=php_mysql.dll
找到:
extension_dir = “./”
将其改为你的 php 安装目录下 ext 子目录的绝对路径。例如我的:
extension_dir = “D:/php/ext/”
这步很重要 。否则接下来 php 会找不到 php_mysql.dll 模块,无法装载。

指定docroot——php文件的存放目录,即你的documentroot。doc_root = “e:\www”

扩展存放目录 extension_dir——更改为真实的扩展存放地址。extension_dir = “./ext”

默认时区更改——在[Date]里面增加:date.timezone = Asia/ChongQing

因为nginx需要的是cgi方式的php,所以如下几个地方是重点,否则nginx无法打开php文件:在php.ini中找到如下,并设置如下:

enable_dl = On
cgi.force_redirect = 0
cgi.fix_pathinfo=1
fastcgi.impersonate = 1
cgi.rfc2616_headers = 1

如果你使用MySQL,那么和我一样拷贝php5ts.dll和libmysql.dll(开启MYSQL)至C:\WINDOWS\system32下面。并且拷贝php.ini至C:\WINDOWS目录下。

启动PHP:

php的启动因为要使用cgi方式,所以有些特殊。我参照网上的方法下载了RunHiddenConsole.exe,使用该工具用其执行的cmd窗口会自动关闭,否则你看一个CMD窗口一直在那晃来晃去,头会晕的。

创建start_php.bat,来启动php,文件内容如下:

@echo off
echo Starting PHP FastCGI…
RunHiddenConsole.exe d:\php\php-cgi.exe -b 127.0.0.1:9000 -c d:\php\php.ini

创建stop_nginx.bat,来关闭php和nginx进程,文件内容如下:

@echo off
echo Stopping nginx…
taskkill /F /IM nginx.exe > nul
echo Stopping PHP FastCGI…
taskkill /F /IM php-cgi.exe > nul
exit

此外:我的nginx在E:\web盘下,运行命令是:E:web\nginx>nginx.exe

我的php也在E盘下,运行名利是:E:\web\php5.3.1>php-cgi.exe -b 127.0.0.1:9000 ,这里的127.0.0.1:9000就是我们在nginx.conf文件中配置的那个,端口号一定要相同哦。如果没有启用tart_php.bat的方式来启用php-cgi.exe,这个dos窗口必须一直开着,不然程序执行不了
这个两个运行顺序无关。 好啦,到了这里我们就在 E:\WWW 目录下放一张index.php文件,在地址栏里面输入http://localhost/index.php ,呵呵,是不是成功啦。