rewrite
目录
rewrite应用
rewrite语法
rewrite <正则表达式> <跳转后的内容> [rewrite支持的flag标记]
rewrite跳转场景
URL看起来更规范、合理
企业会将动态URL地址伪装成静态地址提供服务
网址换新域名后,让旧的访问跳转到新的域名上
服务端某些业务调整
rewrite实际场景
1.3.1 Nginx跳转需求的实现方式
使用rewrite进行匹配跳转
使用if匹配全局变量后跳转
使用location匹配再跳转
1.3.2 rewrite放在server{},if{},location{}段中
location只对域名后边的除去传递参数外的字符串起作用
1.3.3 对域名或参数字符串
使用if全局变量匹配
使用proxy_pass反向代理
常用的nginx正则表达式
^:匹配输入字符串的起始位置
$:匹配输入字符串的结束位置
*****:匹配前面的字符零次或多次
+:匹配前面的字符一次或多次
?:匹配前面的字符零次或一次
.:匹配除\n之外的任何单个字符 使用[.\n]可以匹配包括\n在内的任意字符
****:转义符
\d:匹配纯数字
{n}:重复n次
{n,}:重复n次或更多次
[c]:匹配单个字符c
[a-z]:匹配a-z小写字母的任意一个
[a-zA-Z]:匹配a-z小写字母或A-Z大写字母的任意一个
常见的flag
flag | 作用 |
last | 基本上都用这个flag,表示当前的匹配结束,继续下一个匹配,最多匹配10个到20个 一旦此 |
rewrite | 规则重写完成后,就不再被后面其它的rewrite规则进行处理 而是由UserAgent重新对重写后的URL再一次发起请求,并从头开始执行类似的过程 |
break | 中止Rewrite,不再继续匹配 一旦此rewrite规则重写完成后,由UserAgent对新的URL重新发起请求, 且不再会被当前location内的任何rewrite规则所检查 |
redirect | 以临时重定向的HTTP状态302返回新的URL |
permanent | 以永久重定向的HTTP状态301返回新的URL |
last和break在重定向后,地址栏都不会发生变化,这是它们的相同点,不同点在于last会写在server和if中,break是写在location中,last不会终止重写后的url匹配,break会终止重写后的url匹配。
案例配置
[root@zh html]# mv imgs/ images
[root@zh html]# ls
50x.html images
[root@zh html]# vim ../conf/nginx.conf
location /imgs {
rewrite ^/imgs/(.*\.jpg|\.jpeg)$ /images/$1 break;
}
[root@zh html]# systemctl reload nginx
location /imgs {
rewrite ^/imgs/(.*\.jpg|\.jpeg)$ https://www.baidu.com/ break;
}
last
location /imgs {
rewrite ^/imgs/(.*\.jpg|.*\.png)$ /images/$1 last;
}
location /imgs {
rewrite ^/imgs/(.*\.jpg|\.jpeg)$ https://www.baidu.com/ break;
}
想访问图片,再会访问到百度,并且查看下状态码
[root@zh ~]# vim /usr/local/nginx/conf/nginx.conf
location /imgs {
rewrite ^/imgs/(.*\.jpg|.*\.jpeg)$ /images/$1 redirect;
}
[root@zh ~]# systemctl reload nginx
[root@zh ~]# vim /usr/local/nginx/conf/nginx.conf
location /imgs {
rewrite ^/imgs/(.*\.jpg|.*\.jpeg)$ /images/$1 permanent;
}
[root@zh ~]# systemctl reload nginx
if应用
if语句中的判断条件
正则表达式匹配
==:等值比较;
~:与指定正则表达式模式匹配时返回“真”,判断匹配与否时区分字符大小写;
~*:与指定正则表达式模式匹配时返回“真”,判断匹配与否时不区分字符大小写;
!~:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时区分字符大小写;
!~*:与指定正则表达式模式不匹配时返回“真”,判断匹配与否时不区分字符大小写
文件及目录匹配判断
-f, !-f:判断指定的路径是否为存在且为文件;
-d, !-d:判断指定的路径是否为存在且为目录;
-e, !-e:判断指定的路径是否存在,文件或目录均可;
-x, !-x:判断指定路径的文件是否存在且可执行;
基于浏览器实现分离案例
if ($http_user_agent ~ Firefox) {
rewrite ^(.*)$ /firefox/$1 break;
}
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_user_agent ~ Chrome) {
rewrite ^(.*)$ /chrome/$1 break;
防盗链案例
location ~* \.(jpg|gif|jpeg|png)$ {
valid_referers none blocked www.idfsoft.com;
if ($invalid_referer) {
rewrite ^/ http://www.idfsoft.com/403.html;
}
}