分类: Nginx

nginx防止sql注入

没有评论

2013 年 10 月 14 日 at 下午 1:45分类:Nginx

防止sql注入最好的办法是对于提交后台的所有数据都进行过滤转义。

对于简单的情况,比如包含单引号’ , 分号;, <, >, 等字符可通过rewrite直接重订向到404页面来避免。

用rewrite有个前提需要知道,一般用rewrite进行正则匹配只能匹配到网页的URI,也就是url中?前部分,?以后部分是请求参数。

问号后面的请求参数,在nginx用$query_string表 示,不能在rewrite中匹配到,需要用if判断

例如,对于参数中带有单引号的’进行匹配然后定向到错误页面,

/plus/list.php?tid=19&mid=1124′

rewrite ^.*([\;’\<\>]).* /error.html break;

直接写这样的一条重写肯定不会正确匹配,因为rewrite参数只会匹配请求的uri,也就是/plus/list.php部分。

需要使用$query_string 借助if进行判断,如果查询串种包含特殊字符,返回404。

if ( $query_string ~* “.*[\;’\<\>].*” ){
return 404;
}

Gearman的安装和使用

没有评论

2013 年 04 月 15 日 at 下午 1:17分类:Nginx | PHP | 其他技术

Gearman是一个用来把工作委派给其他机器、分布式的调用更适合做某项工作的机器、并发的做某项工作在多个调用间做负载均衡、或用来在调用其它语言的函数的系统。
通常,多语言多系统之间的集成是个大问题,一般来说,人们多半会采用 WebService 的方式来处理此类集成问题,但不管采用何种风格的 WebService,如 RPC 风格,或者 REST 风格,其本身都有一定的复杂性。相比之下,Gearman 也能实现类似的作用,而且更简单易用。
一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker。
Client:请求的发起者,可以是 C,PHP,Perl,MySQL UDF 等等。
Job:请求的调度者,用来负责协调把 Client 发出的请求转发给合适的 Work。
Worker:请求的处理者,可以是 C,PHP,Perl 等等。
因为 Client,Worker 并不限制用一样的语言,所以有利于多语言多系统之间的集成。
甚至我们通过增加更多的 Worker,可以很方便的实现应用程序的分布式负载均衡架构。
详细的一些信息就去问谷歌大神吧。
Gearman的安装,可能有些麻烦 我一开始用 的CentOS5.4的机器 结果是各种问题啊,后来实在不行了 ,换了6.2的机器来安装。

# wget https://launchpad.net/gearmand/1.2/1.1.5/+download/gearmand-1.1.5.tar.gz
# tar xzvf gearmand-1.1.5.tar.gz
# cd gearmand-1.1.5
# ./configure --prefix=/usr/local/gearmand
#  make
#  make install

这里如果出现了相关configure的错误(Boost ,uuid,mysql)的话,那么到网上找资料解决就好了,基本上都能解决,没什么难度的。
这样子的话,那么gearmand的服务端就完成了,我们称之为Job Server。
那么我们现在启动它:

# usr/local/gearmand/sbin/gearmand -d -P /var/run/gearmand.pid -l /var/log/gearmand.log -u root

接下来我们来安装gearmand的php拓展,我们在http://pecl.php.net中找下是可以找到的,如果找不到那么去这里点击也可以下载到相应的拓展。

# wget http://pecl.php.net/get/gearman-1.1.1.tgz
# tar zxvf gearman-1.1.1.tgz
# cd gearman
# phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --with-gearman=/usr/local/gearmand
# make 
# make install

这里一定要加上–with-gearman参数,不然你又要为这个拓展单独去安装哥libgearmand了,没这个必要,网上有些文章就是这个错误引起的很多问题。
成功之后加入到php的配置文件中。
下面是我写的一个例子:

#worker.php
<?php
$worker=new GearmanWorker();
$worker->addServer("127.0.0.1", 4730);  //连接到Job server(gearmand) 上
$worker->addFunction("test", "testFunction"); 
while ($worker->work());
function testFunction($job) {
	$result = $job->workload();
	sleep(5);
	$data = unserialize($result);
	file_put_contents('./s.txt', var_export($data, true));
}
# client.php
<?php

$client=new GearmanClient();

$client->addServer("127.0.0.1", 4730); //连接到Job server(gearmand)上

$data = array('file'=>__FILE__, 'line'=>__LINE__);

$handler = $client->doBackground("test", serialize($data));//让任务在后台执行也就是异步

var_dump($handler);

$done = false;

echo "Running: .";

do {
   sleep(1);
   $stat = $client->jobStatus($handler);
   if (!$stat[0]) {
      $done = true;
   }
   echo " .";
} while(!$done);

echo "\n";

这个例子呢就是将客户端要执行的抛给gearmand的job server,让他去调度一个空闲的worker来执行我当前的这个任务。我们的woker可以有很多个,jobserver也可以有很多个,这样子就起到了负载均衡的作用了。这个东西在某些情况下应该比队列的效应来的更好些。
在实际使用时应该是运行gearmand -d 的 server 一台或者多台. [要装gearmand,运行gearmand];处理worker的机器若干[要装gearmand 及php so.但gearmand不需要运行].下达任务client若干[要装gearmand 及php so.但gearmand不需要运行]. worker 与 client 不会直接通信,都是通过gearmand来调度分发处理的.

参考:
1、http://www.it300.com/article-15263.html
2、http://blog.s135.com/dips
3、http://gearman.org/download

使用fastcgi_cache加速你的Nginx网站

没有评论

2011 年 11 月 20 日 at 下午 9:36分类:Cache | Nginx | PHP

  对于变化不太频繁的数据,大家都比较喜欢存Memcached以减少数据库的读取,但还是会有语言解析运行上的消耗(比如运行PHP,Python等),当然这个时间很短,记得OP上有个同学说P字头的语言,效率都不高,如果能省去,当然最好。(已经用上Squid等的可以忽略本文)。还有一个问题就是很多时候一个页面由多个数据片断组成,为了提高页面速度,要么分别缓存,要么整体缓存(所谓的Page Cache),其实都比较麻烦,增加和减少数据片断的时,大多需要调整。最后一个问题,所有的数据都存Memcached是否经济?服务器资源足够多的无所谓,捉襟见肘的就要考虑了,当然,生成静态页面是一种方法,需要维护,还是比较累。好吧,nginx的fastcgi_cache可以解决上面的那些问题,比较squid等的好处是简单,不需再要去维护另外一个系统,适合不那么大的网站。
关于Nginx fastcgi_cache,基础的可以参看Nginx官方文档http://wiki.nginx.org/HttpFcgiModule,下面是一个典型的做法是:

fastcgi_temp_path /data/ngx_fcgi_tmp;
fastcgi_cache_path /data/ngx_fcgi_cache levels=2:2 keys_zone=ngx_fcgi_cache:512m inactive=1d max_size=40g;
fastcgi_cache_valid 200 301 302 1d;
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_cache_key $request_method://$host$request_uri;
 

  注意一定要加上$request_method作为cache key,否则如果HEAD类型的先请求会导致后面的GET请求返回为空,全局定义一个缓存空间,配置文件名为,fastcgi_cache.conf,然后在vhost配置里面加上:

fastcgi_cache ngx_fcgi_cache;
include fastcgi.conf;
 

  大概解释下各个参数的含义:
  fastcgi_temp_path:生成fastcgi_cache临时文件目录
  fastcgi_cache_path:fastcgi_cache缓存目录,可以设置目录哈希层级,比如2:2会生成256*256个字目录,keys_zone是这个缓存空间的名字,cache是用多少内存(这样热门的内容nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间,需要注意的是fastcgi_cache缓存是先写在fastcgi_temp_path再移到fastcgi_cache_path,所以这两个目录最好在同一个分区,从0.8.9之后可以在不同的分区,不过还是建议放同一分区。
  fastcgi_cache_valid:定义哪些http头要缓存
  fastcgi_cache_use_stale:定义哪些情况下用过期缓存
  fastcgi_cache_key:定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,Nginx会取这个key的md5作为缓存文件,如果设置了缓存哈希目录,Nginx会从后往前取相应的位数做为目录。
  fastcgi_cache:用哪个缓存空间
  这样就可以了,基本上可以work,但还没完,如何手动清除缓存?有个Nginx的第三方扩展可帮你做到:https://github.com/FRiCKLE/ngx_cache_purge/,如果对大多数第三方扩展无爱,写个清除的脚本也非常简单,以PHP为例:

<?php
function purgeCache()
{
    $url = $this->post('url');
 
    if (empty($url) || !Cola_Com_Validate::url($url)) {
        exit('请输入正确的URL。');
    }
 
    $md5 = md5($url);
    $cacheFile = $this->_cacheRoot . '/' . substr($md5, -2, 2) . '/' . substr($md5, -4, 2) . '/' . $md5;
 
    if (!file_exists($cacheFile)) {
        exit('缓存不存在。');
    }
 
    if (@unlink($cacheFile)) {
        echo '清除缓存成功。';
    } else {
        echo '清除缓存失败。';
    }
}
 

  核心是第11行,直接找到缓存文件,然后删掉就可以,这个脚本有个副作用,手动清除之后,缓存失效,但Nginx后面还会自己清除一遍,然后报个unlink失败的日志,不过无关紧要了。
  淡定,文章还没完,要不就成标题党了,Nginx fastcgi_cache缓存很不错,但我只想在某些页面用fastcgi_cache,很简单,有两种方法,一是在location中定义fastcgi_cache,这样只有满足一定规则的url才会用上cache,其他的就不会了;另外一种方法是在你不需要缓存的页面上,输出禁止缓存的头信息,用ColaPHP的话,直接$this->response->disableBrowserCache(); 具体代码:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
 

如果用CI的话,那么就是:

$this->output->set_header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
$this->output->set_header('Last-Modified: '.gmdate('D, d M Y H:i:s', $last_update).' GMT');
$this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate");
$this->output->set_header("Cache-Control: post-check=0, pre-check=0");
$this->output->set_header("Pragma: no-cache");

  这样就告诉Nginx,这个页面不需要缓存。
  好吧,要淡定不要D疼,还有最后一个问题,如果页面中只有一小部分内容不可以缓存,可以用Nginx fastcgi_cache吗?比如某个内容页,大部分内容可以缓存,但希望把用户的登录信息更新上去。答案是肯定的,可以直接输出用户未登录的页面样式,等页面加载完毕之后,通过ajax异步更新用户信息

原文来源:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2011/1118/9312.html

Nginx(PHP/fastcgi)的PATH_INFO问题

没有评论

2011 年 11 月 12 日 at 下午 7:13分类:Nginx | PHP

PATH_INFO是一个CGI 1.1的标准,经常用来做为传参载体.
比如, 我们可以使用PATH_INFO来代替Rewrite来实现伪静态页面, 另外不少PHP框架也使用PATH_INFO来作为路由载体.
在Apache中, 当不加配置的时候, 对于PHP脚本, AcceptPathInfo是默认接受的, 也就是说:
如果在服务器在存在一个/laruence/index.php
那么, 对于如下请求,
/laruence/index.php/dummy
/laruence/dummy
Apache都接受, 都会认为是对info.php的访问, 并会设置PATH_INFO为dummy
而对于Nginx下, 是不支持PATH INFO的, 也就是它不会默认设置PATH_INFO.
而因为默认的配置文件对PHP的支持只是很基础的, 所以对于默认配置来说对于上面的访问也会是404, 提示找不到文件出错.
这对于一些使用PATH_INFO来传递关键信息的PHP框架来说(比如Kohana, Thinkphp), 简直是致命的.
对于这个问题, 一般来说有俩种解决方法, 第一种就是使用rewrite, 但是这个方法的缺点也是很明显的, 需要把PATH_INFO转换成Query String. 此处就不说明这种方法了~
而, 第二种方法就是我今天要提的, 模拟PATH_INFO:
首先 , 我们知道在Nginx中, 是通过对文件名的扩展名匹配, 来决定是否要交给php cgi服务器去解释的. 在nginx.conf中一般都有如下的默认配置段:

location ~ .php$ {
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include fastcgi_params;
}

所以,对于形如/laruence/info.php/pathinfo这样的文件路径, Nginx是不会正确的交给php cgi服务器的. 所以我们需要改写这段配置为:

     location ~ .php {//片段匹配
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include fastcgi_params;
}

现在, 脚本路径已经交由PHP自己处理了. 那怎么增加PATH_INFO呢?
首先, 我们需要打开PHP中cgi.fix_pathinfo配置项, 打开这个配置项以后, PHP会去根据CGI规范来检查SCRIPT_FILENAME中那部分是访问脚本和PATH_INFO(ini配置解释), 并根据SCRIPT_NAME来修改PATH_INFO(和PATH_TRANSLATED)为正确的值(其实也就是说明, PHP最初对CGI 1.1的支持并不到位)
然后, 就只要添加一个FASTCGI_PARAM项就好了:

location ~ .php {
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include fastcgi_params;
     fastcgi_param PATH_INFO $fastcgi_script_name;
}

现在试试吧…

btw: 当然, 上面的解决方法, 把对路径的分析交给了PHP去处理, 网上也有朋友给出了另外一种配置方法, 这个方法是由Nginx来分析路径(也就不需要fix_pathinfo):

location ~ \.php
{
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include fastcgi_params;
     set $path_info “”;
     set $real_script_name $fastcgi_script_name;
     if ($fastcgi_script_name ~ “^(.+?\.php)(/.+)$”) {
     set $real_script_name $1;
     set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME /var/html/$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}

后记, 最近发现的一个安全漏洞(Nginx + PHP CGI的一个可能的安全漏洞)和这个配置有关系, 请大家务必在使用第二种配置的时候,关闭cgi.fix_pathinfo. 另外关于这个漏洞我个人认为这个和Nginx没啥关系, 不属于Nginx的漏洞. 是配置的问题, 现在到处都在说是Nginx的Bug, 不妥不妥

liunx之shell编程之循环语句

一条评论

2010 年 12 月 17 日 at 下午 4:51分类:Nginx | WEB开发

shell编程中常用的循环语句有for循环,while循环,和until循环。
首先for循环的语法如下:
for 变量 in 列表
do
循环操作的代码
done
或者:for((i=1;i

Apache和Nginx下面如何做301重定向。

没有评论

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

在Apache和Nginx下面如何做301重定向。

1,Apache下面可以用.htaccess设置301重定向

例如把 www.a.com 和 a.com 都301重定向到 www.b.com

RewriteEngine on
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.a.com [NC]
RewriteRule ^(.*)$ http://www.b.com/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^a.com [NC]
RewriteRule ^(.*)$ http://www.b.com/$1 [R=301,L]

2,Nginx中进行301重定向也是非常容易的

比如域名 a.com 要重定向到 www.a.com

server {
server_name a.com;
rewrite ^(.*) http://www.a.com$1 permanent;
}

或者不是访问www.a.com的域名都转向到www.a.com

可以用:

server {
server_name a.com c.com;
if ($host != ‘www.a.com’ ) {
rewrite ^/(.*)$ http://www.a.com/$1 permanent;
}

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路由了。