nginx的rewrite应用和if应用

rewrite

目录

rewrite

rewrite应用

rewrite语法

rewrite跳转场景

rewrite实际场景

常用的nginx正则表达式

常见的flag

案例配置

if应用

if语句中的判断条件

文件及目录匹配判断

基于浏览器实现分离案例

防盗链案例

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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值