Nginx正则表达式

目录

rewrite

location

示例

Nginx正则事实上和Linux操作系统内的正则表达式规则差不多,常用都是那些,比如

^ :匹配输入字符串的起始位置       $ :匹配输入字符串的结束位置

我就不一一例举了,用法都一样,详情看这篇博客

文本编辑三剑客(grep)-CSDN博客

前面在修改 Nginx 配置文件时接触过 rewrite 和 location ,从功能看它们似乎有点相似,其实不然

Nginx 接收到一个HTTP请求时,它会根据请求的URL路径与配置中的 location 块进行匹配,以确定该请求应该由哪个配置块处理。

而 rewrite 用于修改或重定向请求的URL。它一般放在 server、location 或 if 块中使用,并且通常用于URL重写规则,如重定向到不同的路径或为简化URL结构。比如,更换域名后需要保持旧的域名能跳转到新的域名上、网站防盗链等。

简单总结,location 决定了请求的处理位置,rewrite 则可以修改或重定向这些请求路径。

rewrite

rewirte 跳转原理其实也不是那么复杂,无非就是从nginx模块、判断正则表达式、从一个location到另一个location、判断是否需要重定向,最后如果URL没有返回客户端,则继续匹配location,循环最多10次20次,就会返回500

它的语法格式是

rewrite [正则表达式] [替换字符串] [可选参数];

可选参数有

last:本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在 server 和 if 中

break:本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中

redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址

permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

location

location 的匹配大致可以分为三类:

精准匹配:location = / {...}

一般匹配:location / {...}

正则匹配:location ~ / {...}

它的匹配规则就没有正则表达式那么多、杂了

= :就是精确匹配,假如location=/123,不会匹配包含1234或者0123这些包含123的

^~:前缀匹配,匹配以什么什么开头的,如果匹配成功,则不再匹配其他的location

~:区分大小写匹配

~*:不区分大小写匹配

!~:区分大小写取反

~!*:不区分大小写取反

这么多匹配条件放在一起,那么必然要有先后顺序,也就是location的优先级

精确(=)>前缀(^~)>正则(~或~*)>一般(不带有任何修饰)>普通(//)

再次强调 location 是用来匹配URL路径的,不是用来匹配域名的

然后我们以示例说明,假设我们的域名是 www.23.com 

location = /123 

因为 location = 是精确匹配,那么这个location 只能匹配 www.23.com/123

现在换成如下命令

location ^~ /123 

因为 ^~ 是前缀匹配,所以能我们访问 www.23.com/123 下的所有页面都能匹配成功,比如 www.23.com/123 下 有 好多图片或者gif等www.23.com/123/jpg1  jpg2 等等等,都会匹配成功,执行相应的操作

location ~ \.jpg$

$ 符号,后缀匹配,只要访问以jpg结尾的URL路径,都会匹配成功, \ 作为转义符

如果不止需要匹配以jpg结尾,还需要 gif、png等,可以将 .jpg改成  .(jpg|png|gif)$ 用“ | ”或 字符将它们隔开就行了

也可以 对特定要求的数字或者字母进行匹配,比如

location ~ ^/download/[0-9]+

匹配数字多次,比如www.23.com/1743  凡是后面带数字的都会被匹配

上面三个例子都是正则匹配,接下来就是一般匹配,和普通匹配,其实一般匹配就是前缀匹配,只不过没有进行特殊强调,所以优先级不如前缀匹配,前缀匹配执行完后,一般匹配就不执行了

location /123/ 

这个的作用和location ^~ /123 是一样的

通用匹配,location /   匹配所有路径

如果同级别的location ,后面跟的URL路径越长 它的优先级越高

示例

现在公司有一个域名需要维护(www.assddf.com),暂时一段时间不能使用,如果有用户访问这个域名,需要跳转到 www.gzxvcx.com (这两个域名都自己定)

vim /usr/local/nginx/conf/nginx.conf

server{

        listen   80;

        server_name www.assddf.com;

        charset utf-8;

        access_log /var/log/nginx/www.assddf.com-access.log;

        location / {

                if($host = 'www.assddf.com'){

                        rewrite ^/(.*)$ http://www.gzxvcx.com/$1 permanent;

}

        root html;

        index index.html index.htm;

}

}

编辑完后保存退出

我们再 echo "172.16.233.102 www.assddf.com www.gzxvcx.com" >> /etc/hosts

重启nginx服务

此时我们浏览器输入 www.assddf.com 会自动跳转到 www.gzxvcx.com ,我们f12 检查网页请求标头,也会看到状态码对应的301 永久重定向

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值