目录
Nginx正则事实上和Linux操作系统内的正则表达式规则差不多,常用都是那些,比如
^ :匹配输入字符串的起始位置 $ :匹配输入字符串的结束位置
我就不一一例举了,用法都一样,详情看这篇博客
前面在修改 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 永久重定向