nginx伪静态之try_files和rewrite讲解

在新浪博客上看到这篇 讲解的不错  分享一下

服务器脚本以php为例

一、伪静态是个啥?
1、说起伪静态基本上搞web开发的人,多多少少都有了解与使用,有人会说什么时候会使用伪静态?使用原生的url地址不是蛮好的吗,确实是这样的,其实我蛮喜欢原生的url风格的,但是由于某些原因我不得不使用伪静态。比如:(1), url地址比较友好,看着爽,更有说服务力(2), 如果是一个内容站,有利于seo优化(3), 有效的防止sql注入,让别人不知道你真实的url地址(4), 比如你在公司上班,你的领导,可能就会让你设置伪静态,工作需要。
2、那说了好处,有没有坏处呢? 坏处肯定是有的,与原生的url比较在性能上,不如原生的url,简单的说伪静态就是在服务器上又进行了一层url解析,消耗服务器资源。当然了这点消耗与优点相比,我们还是可以接受的。
3、那伪静态长什么样呢?比如:http://www.xxab.com/hello/world.htmlhttp://www.xxx.com/content/23223.htmlhttp://www.xxx.com/content/go/cb以上这样的url地址,我们就可以叫伪静态url(都是进行过url处理)
4、那原生的url地址是什么样呢?比如:http://www.xxx.com/index.php?name=will&age=20http://www.xxx.com/content/list.php?id=3以上这样的url地址,就是原生url


二、nginx怎么设置伪静态呢?
如果你之前使用过apache的话很简单的,只要apache有rewrite模块就可以了,然后就可以自己编写rewrite规则了。但是nginx如果你不明白原理就麻烦了,但只要明白原理就简单的,下面的案例都是我本地开发环境的配置,如果讲的不太合适的地方,请见谅。

1,nginx配置:server {        listen       80;        server_name  localhost;        access_log  logs/localhost.access.log  main;        #开启伪静态日志,方便调试        rewrite_log on;        #输出错误日志,错误级别设置为notice        error_log logs/error-test.log notice;

        root html/test;        index  index.php index.html;        location / {                try_files $uri $uri/ @aaaaab;        }
        //注意使用@符号,不然不成功        location @aaaaab {                include D:/nginx/html/test/.htaccess;        }
        location ~ \.php$ {                fastcgi_pass 127.0.0.1:9000;                fastcgi_index index.php;                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;                 include fastcgi_params;        }}

2, .htaccess清单
rewrite 语法格式:rewrite   [regex]                  [replacement]      [flag];               url正则表达式        替换真实url          标记(last,break)
实例:rewrite   ^/article/index.html$   /index.php?process=article&a=index last;
//注意,这是一行,由于一行写不下,自动换行了rewrite ^/article/list/([0-9]+)-([0-9]+)-([0-9]+).html$ /index.php?process=article&a=list&group_id=$1&category_id=$2&p=$3 last;
rewrite ^/article/detail/([0-9]+).html$   /detail.php?id=$1 last;
rewrite ^/group/([0-9]+).html$   /group.php?group_id=$1 last;


3,上面的案例虽然小,但是五脏俱全,我们开始一个一个的分析
try_files $uri $uri/ @aaaaab; 这句话是什么意思?
try_files从字面上理解就是尝试文件,再结合环境理解就是“尝试读取文件”,那他想读取什么文件呢,答:读取静态文件
$uri  这个是nginx的一个变量,存放着用户访问的地址,比如:http://www.xxx.com/index.html, 那么$uri就是 /index.html
$uri/ 代表访问的是一个目录,比如:http://www.xxx.com/hello/test/    ,那么$uri/就是 /hello/test/
完整的解释就是:try_files 去尝试到网站目录读取用户访问的文件,如果第一个变量存在,就直接返回;不存在继续读取第二个变量,如果存在,直接返回;不存在直接跳转到第三个参数上。

比如用户访问这个网地址:http://www.xxx.com/test.htmltry_files首先会判断他是文件,还是一个目录,结果发现他是文件,与第一个参数 $uri变量匹配。然后去到网站目录下去查找test.html文件是否存在,如果存在直接读取返回。如果不存在直接跳转到第三个参数,而第三个参数是一个location,而这个location里面配置的就是rewrite规则。

说到这里大家就明白了,能看懂上面的配置了。那有人会问了,还要try_files干什么呀,直接使用rewrite不就可以了吗?答:不可以,因为rewrite这个指令把所有请求过来的url地址,都与htaccess文件中的正则地址进行一次匹配,这样的话,静态的url地址也进行了一次匹配,比如http://xxxx.com/aa.png,这个地址是不需要重写的,但是rewrite也进行了一次匹配,这就浪费服务器资源,影响执行效率。而我们真正需要匹配的,其实都是一些动态url地址,如果我说这么多,你还不明白的话,可以打印日志查看。

include D:/nginx/html/test/.htaccess; 这句就是去加载伪静态文件,把所有的规则写在这里面,注意这里要使用全路径,不然不成功。

文章来源: nginx伪静态之try_files和rewrite讲解

人吐槽 人点赞

猜你喜欢

发表评论

用户名: 密码:
验证码: 匿名发表

你可以使用这些语言

查看评论:nginx伪静态之try_files和rewrite讲解