一文读懂nginx伪静态,看完就会写

域名:test.haidou.top

创建了3个html作为测试

认识rewrite:

作用域:server,location,if

使用rewrite需要ngx_http_rewrite_module模块,如果编译的时候没有安装,那可能会失败,这个模块需要pcre支持

rewrite格式:
rewrite  ^第一部分$  (实际地址/跳转地址)第二部分 指令;
rewrite是固定格式,告诉NGINX使用rewrite
第一部分,可以写死链接,也可以使用正则
^是起始匹配:从这里开始
$是终止匹配:到这里结束
实际地址/跳转地址:是伪静态的真实路径,或者跳转到哪里的地址
指令:last,break,permanent,redirect

有点繁琐了,实例说话:

实例1:访问index.html返回index1.html的内容

没有添加规则是这样的

添加rewrite规则

reload之后再访问

rewrite ^/index.html$ /index1.html break;

完整匹配到index.html ,返回index1.html的内容 ,然后终止匹配

实例2:访问index1.html跳转到www.baidu.com

先访问首页看看

返回的还是index1.html的内容,在访问index1.html看看

可以看得出,直接301跳转到百度了,当然,也可以跳转到本域名下的其他链接,

我这里是因为浏览器有缓存,所以我换了浏览器,记得清浏览器缓存。

访问index1.html 301跳转到index2.html了

这个跳转就是服务器直接访问要跳转的页面

将permanent换成redirect ,301就变成302了,主要就是状态码的变化

使用正则:

有时候工作中,需要对几个,几十个,几百个url做跳转或者伪静态访问,这时候就需要用到正则了,找到url的规律,然后使用正则,通过一条rewrite实现功能。

认识正则:

~      为区分大小写的匹配。
~*     不区分大小写的匹配(匹配firefox的正则同时匹配FireFox)。
!~     不匹配的
!~*    不匹配的
.     匹配除换行符以外的任意字符
\w     匹配字母或数字或下划线或汉字
\s     匹配任意的空白符
\d     匹配数字
\b     匹配单词的开始或结束
^     匹配字符串的开始
$     匹配字符串的结束
*     重复零次或更多次
+     重复一次或更多次
?     重复零次或一次
{n}     重复n次
{n,}     重复n次或更多次
{n,m}     重复n到m次
*?     重复任意次,但尽可能少重复
+?     重复1次或更多次,但尽可能少重复
??     重复0次或1次,但尽可能少重复
{n,m}?     重复n到m次,但尽可能少重复
{n,}?     重复n次以上,但尽可能少重复
\W     匹配任意不是字母,数字,下划线,汉字的字符
\S     匹配任意不是空白符的字符
\D     匹配任意非数字的字符
\B     匹配不是单词开头或结束的位置
[^x]     匹配除了x以外的任意字符

使用正则:

创建一些文件做测试用

文件创建完成,编写rewrite编写rewrite并使用正则

编写rewrite,使用正则

实例1: 访问所有数字链接,显示index1.html的内容

rewrite ^/(\d+).html$ /index1.html last;

rewrite ^$ 是格式,/(\d+).html 是匹配内容,/是以/开头,因为有^,域名后面首个字符是/,然后(\d+) 是正则,参考上方“\d 匹配数字 + 重复一次或更多次”,那么,这个就是 匹配一个或者多个数字,.html是终止,因为有$,至于.嘛,正则里是“匹配除换行符以外的任意字符”,也可以加个\ ,给正则转义成字符串,这样就精准匹配了,不过本人比较懒~

实例2: 动态访问,xx(1-9)的链接,显示相对于1-9的页面

rewrite ^/xx(\d+).html$ /$1.html last;

xx是写死的匹配项,(\d+)是匹配数字,后面的index1 变成了 $1 ,前面的第一个正则,就是$1,如果有多个,就是$2,$3……再来个例子就明白了

实例3:有多个参数动态变化,实现伪静态访问

rewrite ^/hai(\d+)dou(\w+).html$ /$2.html last;

拆规则分析

^/hai是固定写死的,(\d+)是匹配数字,dou是写死的字符串

(\w+) “匹配字母或数字或下划线或汉字,重复一次或更多次”

所以,这个(\w+)匹配一个或者多个字母,数字,下划线,汉字

$2是取第二个正则,第一个是(\d+),第二个是(\w+),

写的是$2,

http://test.haidou.top/hai4124douw.html

访问的是这个链接,/hai4124douw.html

拆开,(\d+)是4124,(\w+)是w,所以真实地址是 /w.html的内容

tip: (\w+)里包含了数字,可以当(\d+)使用,(\d+)不能当(\w+)使用,不建议这么做,如果纯数字的链接,你用了(\w+),那么数字链接,上面有字母下划线也可以访问了。

匹配链接的长度

实例1:访问链接里包含haidou22.html ,22是变量,最少2位数,最多4位数的链接,返回相应页面。

数字长度是1位,没有进入到该条伪静态规则,也没有发现匹配的规则,最后找不到haidou1.html文件,所以提示404

数字长度是2位,满足条件,进入伪静态规则,返回/10.html的内容

数字长度是3位,满足条件,进入规则,文件不存在,所以提示404

创建个1010的文件,访问4位数查看

数字长度是4位,满足条件,进入规则,返回内容

rewrite "^/haidou(\d{2,4}).html$" /$1.html last;

如果规则写的是 {4,} 代表最少4位数。最多无穷大。

last:  匹配到之后,返回结果,然后重新发起一个请求,继续进行匹配。
break: 匹配到之后,返回结果,完成请求。
permanent: 匹配到之后,301跳转到新的地址。
redirect:匹配到之后,302跳转到新的地址。
下面是从网上摘取的关于last和break的区别,点击即可看到原文
last会对server标签重新发起请求,而break就直接使用当前的location中的数据源来访问,要视情况加以使用。一般在非根的location中配置rewrite,都是用的break;而根的location使用last比较好,因为如果配置了fastcgi或代理访问jsp文件的话,在根location下用break是访问不到。测试到rewrite有问题的时候,也不妨把这两者换换试试
© 版权声明
THE END
喜欢就支持一下吧
点赞1
分享
评论 抢沙发