一、 说明
rewrite地址可以实现地址重写,简单的用法就是伪静态网页,Nginx的rewrite规则需要pcre软件的支持,即通过Perl兼职正则表达式对语法进行规则匹配
rewrite语法
rewrite regex replacement [flag]
解释:rewrite指令匹配regex处的正则表达式,匹配成功后跳转到replacement处的网页,最后flag是标记rewrite ^/(.*) http://www.etiantian.org/$1 permanent
解释:此处的正则表达式表示匹配所有,匹配成功后跳转到etiantian.org这个网页上。$1是后向引用正则表达式括号里面的内容,并用permanent做标记为永久301重定向regex常用正则表达式
\ 将后面的字符标记为一个特殊字符、原意字符、后向引用
如\n匹配换行符,\$匹配$
^ 匹配输入字符串的起始位置
$ 匹配输入字符串的结束位置
* 匹配前面的字符零次或多次
+ 匹配前面的字符一次或多次
? 匹配前面的字符零次或一次
. 匹配除\n之外的任何单个字符
(pattern) 匹配括号内的表达式,常用来做后向引用
- rewrite指令flag标记说明
last 本条规则匹配完成后,继续向下匹配新的location URI规则。 break 本条规则匹配完成后终止,不再向后匹配规则。 redirect 返回302临时重定向。 permanent 返回301永久重定向。
说明:
last和break实现url重写,浏览器显示的地址不变,服务器端访问的程序和路径发生了变化
redirect和permanent实现url跳转,浏览器显示的地址是跳转后的地址
使用别名alias时,要使用last标记,。
使用proxy_pass时,要使用break标记
在根location(即location/{......})中或server{......}标签中,编写rewrite规则,建议使用last标记
在普通的loaction(如location/oldboy/{......}或if{ })中编写rewrite规则,则建议使用break标记rewirt在企业中的应用场景
1)可以跳转用户浏览的url,使其看起来更规范,符合开发及产品人员的需求
2)为了让搜索引擎搜录网站的内容,将动态url地址伪装成静态地址
3)网站换新域名后,将旧域名的访问跳转到新域名上
4)根据特殊变量、目录、客户端的信息进行url跳转
二、 企业案例
需求
要求访etiantian.org时,跳转到www.etiantian.org错误配置[很常见]
配置[root@xxx ~]# cat bbs.conf server { listen 80; server_name www.etiantian.org bbs.org; rewrite ^/(.*) http://www.etiantian.org/$1 permanent; root html/bbs; index index.html index.htm; }访问测试
[root@xxx ~]# curl -L etiantian.org
curl: (47) Maximum (50) redirects followed
显示最多跳转50次,已经跳转了47次,放弃跳转
说明进入了无限循环状态
2) 错误原因
[root@xxx ~]# curl -Lv etiantian.org
#显示循环过程,显示内容略,可以从显示内容中,看出无限循环
原因分析:
第一次访问etiantia.org后,并要求跳转至www.etiantian.org
第二次用www.etiantian.org访问,不管前面是什么域名,再次匹配跳转规则,被要求再次跳转,所以进入了无限循环
- 正确配置
方法1:使用2个虚拟服务器输入etiantian.omg网址后,会永久重定向到www.etiantian.omg网址,且地址栏显示跳转后的地址[root@xxx ~]# cat www.conf server { listen 80; server_name etiantian.omg; rewrite ^/(.*) www.etiantian.omg/$1 permanent; } server { listen 80; server_name www.etiantian.omg; location / { root html/www; index index.html index.htm; }
2) 方法2:用if语句判断后,再进行地址重写
[root@xxx ~]# cat bbs.conf
server {
listen 80;
server_name bbs.etiantian.org bbs.org;
if ($host ~* "^etiantian.org$") {
rewrite ^/(.*) http://bbs.etiantian.org/$1 permanent;
}
root html/bbs;
index index.html index.htm;
}