当前位置: 首页 > news >正文

Nginx 正则表达式与rewrite

目录

一、正则表达式

二、rewrite

2.1 rewrite简述

2.2 rewrite 跳转 

2.3 rewrite 执行顺序

2.4 rewrite 语法格式

三、location

3.1 location 类别

3.2 location常用匹配规则

3.3 location优先级

3.4 示例说明

3.5 匹配规则总结

3.6 三个匹配规则定义

四、实战案例

4.1 基于域名的跳转

4.2 基于客户端 IP 访问跳转

4.3 基于旧域名跳转到新域名后面加目录

4.4 基于参数匹配的跳转

4.5 基于目录下所有 php 结尾的文件跳转

4.6 基于一条最普通url请求的跳转


一、正则表达式

常用的正则表达式

^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
?匹配前面的字符零次或一次,例如“od(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
.

匹配除“\n”之外的任何单个字符,

若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式

\将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d匹配纯数字
{n}重复 n 次
{n,}重复 n 次或更多次
{n,m}重复 n 到 m 次
[]定义匹配的字符范围
[c]匹配单个字符 c
[a-z]匹配 a-z 小写字母的任意一个
[a-zA-Z0-9]匹配所有大小写字母或数字
()表达式的开始和结束位置
|或运算符

二、rewrite

注:

rewrite与location主要区别:

rewrite 是在同一域名内更改获取资源的路径

location 是对一类路径做控制访问或反向代理,还可以 proxy_pass 到其他机器

2.1 rewrite简述

  • rewrite功能就是,使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
  • 比如:更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
  • rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,
  • 例如:http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写

2.2 rewrite 跳转 

跳转的场景

  • 调整用户浏览的URL,看起来更规范,呵护开发及产品人员的需求
  • 为了让搜索引擎搜寻网站内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务
  • 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的360buy.com会跳转到jd.com。
  • 服务端某些业务调整,比如根据特殊变量、目录、客户端的信息进行URL调整等

跳转的实现

  • Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else
  • 跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
  • PCRE支持:perl兼容正则表达式的语法规则匹配
  • 重写模块 set 指令:创建新的变量并设其值

2.3 rewrite 执行顺序

  • 执行server块里面的rewrite指令
  • 执行location匹配
  • 执行选定的location中的rewrite指令

2.4 rewrite 语法格式

语法格式:rewrite <regex> <replacement> [flag];
regex :表示正则匹配规则
replacement :表示跳转后的内容
flag :表示 rewrite 支持的 flag 标记

flag标记说明
last本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在 server 和 if 中
break本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中
redirect返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

注:

  • last – 基本上都用这个Flag
  • break – 中止Rewirte,不在继续匹配
  • redirect – 返回临时重定向的HTTP状态302
  • permanent – 返回永久重定向的HTTP状态301

last和break最大的不同在于

  • break 是终止当前location的rewrite检测,而且不再进行location匹配 
  • last是终止当前location的rewrite检测,但会继续重试location匹配并处理区块中的rewrite规则

可用作判断的全局变量

$args           #这个变量等于请求行中的参数。
$content_length # 请求头中的Content-length字段。
$content_type   # 请求头中的Content-Type字段。
$document_root  # 当前请求在root指令中指定的值。
$host           # 请求主机头字段,否则为服务器名称。
$http_user_agent # 客户端agent信息
$http_cookie    # 客户端cookie信息
$limit_rate     # 这个变量可以限制连接速率。
$request_body_file # 客户端请求主体信息的临时文件名。
$request_method  # 客户端请求的动作,通常为GET或POST。
$remote_addr    # 客户端的IP地址。
$remote_port    # 客户端的端口。
$remote_user    # 已经经过Auth Basic Module验证的用户名。
$request_filename # 当前请求的文件路径,由root或alias指令与URI请求生成。
$query_string   # 与$args相同。
$scheme #HTTP 方法(如http,https)。
$server_protocol # 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。
$server_addr    # 服务器地址,在完成一次系统调用后可以确定这个值。
$server_name    # 服务器名称。
$server_port    # 请求到达服务器的端口号。
$request_uri    # 包含请求参数的原始URI,不包含主机名,如:”/foo/bar.php?arg=baz”。
$uri # 不带请求参数的当前URI,$uri不包含主机名,如”/foo/bar.html”。
$document_uri   # 与$uri相同。
例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php

三、location

3.1 location 类别

location 大致可以分为三类:

精准匹配location = / {...}
一般匹配location / {...} 
正则匹配location ~ / {...}

3.2 location常用匹配规则

=进行普通字符精确匹配,也就是完全匹配        location = yudh   www.kgc.com/yudh
^~表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location
~区分大小写的匹配。    location  ~ \.jpg$ {}      jpg
~*不区分大小写的匹配。 location  ~ \.jPg$ {}      jpg
!~ 区分大小写的匹配取非
!~*不区分大小写的匹配取非

3.3 location优先级

①首先精确匹配 =
②其次前缀匹配 ^~
③其次是按文件中顺序的正则匹配 ~或~*
④然后匹配不带任何修饰的前缀匹配  abc
⑤最后是交给 / 通用匹配  

3.4 示例说明

(1)location = /         http://www.kgc.com/         他不会匹配/data       http://www.kgc.com/data
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location  /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。(2)location / {}        http://www.kgc.com/data  http://www.kgc.com/data/abc     /a/usr/local/nginx/html/data/abc  
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,
但若后面是正则表达式会和最长字符串优先匹配(最长匹配)(3)location /documents/ {}      http://www.kgc.com/documents/abc
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条(4)location /documents/abc {}     www.baidu.com/
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location
只有其它 location后面的正则表达式没有匹配到时,才会采用这一条(5)location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条http://www.kgc.com/documents/abc/testlocation /documents/abc/test/ {} 
location ^~ /documents/ {} 
location ~* /documents/ {} 
location ^~ /documents/abc {} (6)location ~* \.(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求
然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则(7)location /images/abc {}  
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在location /documents/ {}
location /documents/abc/ {}
location /documents/abc/test/ {}(8)location ~ /images/abc {} 
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条(9)location /images/abc/1.html {}      location /images/abc/test
匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

3.5 匹配规则总结

首先看 优先级:精确>前缀>正则>一般>通用
优先级相同:正则看上下顺序,上面的优先;一般匹配看长度,最长匹配的优先
精确、前缀、正则、一般 都没有匹配到,最后再看通用匹配  一般匹配

3.6 三个匹配规则定义

实际网站使用中,至少有三个匹配规则定义

1、第一个必选规则

直接匹配网站根,通过域名访问网站首页比较频繁,使网。
可以是一个静态首页,也可以直接转发给后端应用服务器用这个会加速处理,比如说官
location = / {root   html;index  index.html index.htm;
}

2、第二个必选规则

处理静态文件请求,这是nginx作为http服务器的强项
有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {root /webroot/static/;
}/static/location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {root /webroot/res/;
}

3、第三个必选规则

通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求
location / {proxy_pass http://tomcat_server;
}

四、实战案例

4.1 基于域名的跳转

公司旧域名www.ljm.com有业务需求变更,需要使用新域名www.lucien.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变

vim /usr/local/nginx/conf/nginx.conf
server {listen   80;server_name  www.ljm.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.ljm.com.access.log;  #日志修改location / {#添加域名重定向if ($host = 'www.ljm.com'){#$host为rewrite全局变量,代表请求主机头字段或主机名rewrite ^/(.*)$ http://www.lucien.com/$1 permanent;#$1为正则匹配的内容,即域名后边的字符串}root   html;index  index.html index.htm;}
}

浏览器输入模拟访问 http://www.lic.com/test/1.html
会跳转到www.kiki.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转

4.2 基于客户端 IP 访问跳转

公司业务新版本上线,要求所有 IP 访问都显示一个固定维护页面

只有公司 IP :192.168.184.80访问正常

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.ljm.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.ljm.com-access.log  main;	#日志修改#设置是否合法的IP标记set $rewrite true;					#设置变量$rewrite,变量值为boole值true#判断是否为合法IPif ($remote_addr = "192.168.184.60"){#当客户端IP为192.168.184.10时,将变量值设为false,不进行重写set $rewrite false;}#除了合法IP,其它都是非法IP,进行重写跳转维护页面if ($rewrite = true){				#当变量值为true时,进行重写rewrite (.+) /weihu.html;		#重写在访问IP后边插入/weihu.html}location = /weihu.html {root /var/www/html;				#网页返回/var/www/html/weihu.html的内容}location / {root   html;index  index.html index.htm;}
}
mkdir -p /var/www/html/
echo 'hello weihu!' > /var/www/html/weihu.html
systemctl restart nginx

浏览器访问
只有 IP 为 192.168.184.10 能正常访问,其它地址都是维护页面

4.3 基于旧域名跳转到新域名后面加目录

我们访问 http://www.ljm.com,现在需要将这个域名下面的访问都跳转到http://www.lucien.com/lucien

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.ljm.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/ljm.com-access.log;#添加location /post {rewrite (.+) http://www.lucien.com/lucien$1 permanent;	#这里的$1为位置变量,代表/post}location / {root   html;index  index.html index.htm;}
}

4.4 基于参数匹配的跳转

现在访问http://www.kgc.com/100-(100|200)-100.html 跳转到http://www.kgc.com页面

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.kgc.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.kgc.com-access.log;if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {rewrite (.+) http://www.kgc.com permanent;}location / {root   html;index  index.html index.htm;}
}
systemctl restart nginx
使用浏览器访问http://www.kgc.com/100-200-100.html 或 http://www.kgc.com/100-100-100.html 跳转到http://www.kgc.com页面

4.5 基于目录下所有 php 结尾的文件跳转

要求访问 http://www.kgc.com/upload/123.php 跳转到首页

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.kgc.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.kgc.com-access.log;location ~* /upload/.*\.php$ {rewrite (.+) http://www.kgc.com permanent;}location / {root   html;index  index.html index.htm;}
}systemctl restart nginx
或
systemctl reload nginx浏览器访问 http://www.kgc.com/upload/123.php 跳转到http://www.kgc.com页面

4.6 基于一条最普通url请求的跳转

要求访问一个具体的页面如 http://www.kgc.com/abc/123.html 跳转到首页

vim /usr/local/nginx/conf/nginx.conf
server {listen       80;server_name  www.kgc.com;		#域名修改	charset utf-8;access_log  /var/log/nginx/www.kgc.com-access.log;location ~* ^/abc/123.html {rewrite (.+) http://www.kgc.com permanent;}location / {root   html;index  index.html index.htm;}
}systemctl restart nginx
浏览器访问 http://www.kgc.com/abc/123.html 跳转到http://www.kgc.com页面
http://www.lryc.cn/news/424611.html

相关文章:

  • tekton什么情况下在Dockerfile中需要用copy
  • 第九届世界渲染大赛在哪里提交作品呢?
  • fastjson(autoType)反序列化漏洞
  • Java入门基础16:集合框架1(Collection集合体系、List、Set)
  • Qt如何调用接口
  • Android14之解决编译libaaudio.so报错问题(二百二十七)
  • 【专题】2024年7月人工智能AI行业报告合集汇总PDF分享(附原数据表)
  • 干货分享|如何使用Stable Diffusion打造会说话的数字人?
  • OrangePi AIpro学习4 —— 昇腾AI模型推理 C++版
  • vue js 多组件异步请求解决方案
  • 【Android】不同系统版本获取设备MAC地址
  • 残差网络--NLP上的应用
  • 1章4节:数据可视化, R 语言的静态绘图和 Shiny 的交互可视化演示(更新2024/08/14)
  • 浅谈个人用户如何玩转HTTP代理
  • 动手研发实时口译系统
  • C#(asp.net)电商后台管理系统-计算机毕业设计源码70015
  • Unity 中创建动画的教程
  • 2024年最全渗透测试学习指南,小白也能轻松hold住!零基础到精通,看完这篇就够了!
  • 有道云docx转换markdown,导入hugo发布到github page,多平台发布适配
  • 如何理解:进程控制
  • 工业互联网边缘计算实训室解决方案
  • Android全面解析之Context机制(一) :初识Android context
  • 气象百科——气象监测站的介绍
  • 学懂C++(三十):高级教程——深入解析 C++ Windows API 的多线程支持
  • 苹果笔记本电脑可以玩steam游戏吗 MacBook支持玩steam游戏吗 在Steam上玩黑神话悟空3A大作 苹果Mac怎么下载steam
  • 海康摄像头(测温型)桌面客户端开发分享
  • 骑行耳机哪个品牌性价比高?精选五大畅销骑行耳机推荐!
  • libcurl8.9.1 上传json
  • 什么是暗水印?企业暗水印如何实施?企业保护利器
  • Qt 系统相关 - 文件