Nginx服务的Rewrite和正则表达式
Rewrite实际场景
配置跳转的原因
为了让URL看起来更规范、合理
企业会将动态URL地址伪装成静态地址提供服务
网址换新域名后,期望用户可以通过旧的访问跳转到新的域名上
服务端某些业务调整
Nginx跳转需求的实现方式
使用rewrite进行匹配跳转(主要匹配的是具体的路径)
使用if匹配全局变量后跳转,结合布尔值时间true和fales的跳转
使用location匹配再跳转(可以匹配后执行proxy_pass,将请求跳转到其他服务上)
rewrite如何实现跳转
nginx服务基于http协议rewrite重写mudule模块
nginx:主从URL重写,其中有一个布尔值:返回值的结果只有true或者false;同时特性:只支持if单分支语句
跳转:循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持:perl兼容正则表达式的语法规则匹配
重写模块set指令:自己设置即可以使用布尔值
如下:标志位参数:$1:具体的路径,即标志位
www.baidu.com/bbs/install/index.php ##URL
www.baidu.com ##URI $0
/bbs/install/index.php ## $1
rewrite功能
rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求
rewrite生效位置
rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,
例如http:/ /www.da.com/a/we/ index。php?id=1&u=str 只对/a/we/ index . php重写
Nginx正则表达式元字符
^ :匹配输入字符串的其实位置
$ :匹配输入字符串的结束位置
* :匹配前面额字符零次或多次
+ :匹配前面的字符一次或多次
? :匹配前面的字符零次或一次
. :表示任意单个字符
\ :转义符
\d:匹配纯数字
\w :匹配字母、数字、下划线、汉字
\s :匹配任意空白符
\b :匹配单词的开始或结束
{n} :重复n次
{n,} :重复n次或更多次
[c] :匹配单个字符c
[a-z] :匹配a-z小写字母的任意一个
[a-zA-Z] :匹配a-z小写字母或A-Z大写字母的任意一个
() :表达式的开始和结束位置
| :或运算符
Rewrite命令
rewrite [flag];
#regex :正则
#replacement :跳转后的内容
#flag :rewrite支持的flag标记,对此条匹配结果进行标记
flag标记说明
last :相当于Ppache的[L]标记,表示完成rewrite
break :本条规则匹配完成即终止,不再匹配后面的任何规则
redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url
last和break的区别:
使用场景: last一般写在server和if中,break一般使用再location中
URL匹配: last不终止重写后的url匹配,break终止重写后的url匹配,配置文件中有多个location匹 配,其中last不影响后面的匹配,而break则终止后面的匹配,其匹配顺序有优先级
rewrite执行顺序
http {
server {
rewrite #优先级为1,最先执行
location ~*\.(jpg|gif|swf)$ {
rewrite #优先级为2
vald_referers none blocked *.whd.com whd.com;
if ( $infalid_referer ) {
rewrite ^/ http://www.whd.com/crror.png; #优先级为3
}
}
}
}
location分类
精准匹配:location = / {…} 示例:location = patt {} PS: 精确匹配字符串
一般匹配:location / {…} 示例:location patt {} PS:只要包含patt的字符串即可
正则匹配: location ~ / {…} 示例:location~patt{}PS:按照正则表达式的方式匹配
~:表达的意思首先是可以支持正则表达式,其次是区分大小写
location 优先级
:精确匹配
^~:前缀匹配
和*:按文件中的顺序的正则匹配;这里区分匹配是文件还是目录
文件:优先级高于
目录:优先级高于
普通匹配:以xxx路径为前缀的匹配
/:通用匹配
Rewrite和Location的小结
相同点:都能实现跳转
不同点:
rewrite是在同一域名内更改获取资源的路径
location是对一类路径做控制访问或反向代理,还可以 proxy_ pass到其他机器
rewrite会写在location里,执行顺序
执行server块里面的rewrite指令
执行location匹配
执行选定的location中的rewrite指令
基于域名的跳转
vim /etc/hosts #添加映射
192.168.8.151 www.zsx.com www.cc.com
mkdir -p /var/log/nginx/
vim /usr/local/nginx/conf/nginx.conf ##修改配置文件
server {
listen 80;
server_name www.zsx.com; ##域名修改
#charset koi8-r;
access_log /var/log/nginx/www.zsx.com-access.log; ##开启并对日志保存路径进行修改
location / { ##在原有location位置插入
if ($host = 'www.zsx.com'){ ##$host为rewrite全局变量,代表请求主机头字段或主机名
rewrite ^/(.*)$ http://www.cc.com/$1 permanent; ##$1为匹配的位置变量,即域名后面的字符串,同时永久跳转;(.*)
}
root html;
index index.html index.htm;
}