Linux骚操作之第三十六话nginx rewrite

6 篇文章 0 订阅

前言

现在Nginx已经成为很多公司作为前端反向代理服务器的首选,在实际的工作中往往会遇到很多跳转(重写URL)的需求,例如,百度公司更换域名后但依旧希望客户使用旧域名,就需要保持旧的域名能跳转到新的域名上。如果在后端使用的apache服务器,虽然也可以做跳转,规则库亦然很强大,但使用NGINX跳转效率更高,因为可以使用正则精确匹配。

一、NGINX跳转需求的实现方

1、使用rewrite进行匹配跳转(具体路径)

2、使用if匹配全局变量后跳转(例如:维护页面的跳转)

3、使用location匹配再跳转(可以匹配后执行proxy_pass,将请求跳转到其他服务上)

二、Rewrite跳转场景

1、调整用户浏览的URL,看起来更规范,合乎开发及产品人员的需求

2、为了让搜索引擎搜寻网络内容及用户体验更好,企业会将动态URL地址伪装成静态地址提供服务

3、网址换新域名后,让旧的访问跳转到新的域名上

4、服务端某些业务调整,比如特殊变量、目录、客户端的信息进行URL调整等

5、重点:URL匹配包 重新跳转到新的网址

6、Nginx rewrite(RUL)

三、rewrite跳转实现

1、nginx通过ngx_http_rewrite_module模块支持URL重写,支持IF条件判断,但不支持else

2、跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后NGINX将返回500错误

3、PCRE支持,perl兼容正则表达式的语法规则匹配

4、重写模块set指令:创建新的变量并设其值

四、location优先级

1、相同类型的表达式,字符串长度的优先匹配

2、首先精准匹配(=)

3、其次是前缀匹配(^~)

4、其次是按文件中顺序的正则匹配(*)

5、然后匹配不带任何修饰的前缀匹配,/image/abc(范围更小)

6、最后:交给/通用匹配

五、location 示例说明

1、location = / ()第一:=为精准匹配,第二:/ 主机名后不带任何字符串,比如访问/和/data,则/匹配,但是/data不匹配

2、location / () www.hy.com/路径第一:因为所有的地址都以/开头,所以这条规则将匹配到所有请求比如访问/和/data,则/匹配,/data也匹配,但若后面是正则表达式会和最长字符串优先匹配(优先匹配)

3、location / documents/()第一:匹配任何以/documents/开头的地址,匹配符合以后,还要继续往下搜索它location,只有其他location后面的正则表达式没有匹配到时,才会采用这一条。

4、location /documents/abc()第一:匹配任何以documents/abc开头的地址,匹配符合以后,还要继续往下搜索其它location,只有其他location后面的正则表达式没有匹配到时,才会采用这一条。

5、Location ^~ /images/ ()匹配任何以/images/开头的地址,匹配符合以后,停止往下搜索正则,采用这条

6、location ~* . (gif|jpg|jpeg)$ {}案例:执行选定的location中if中rewrite指令此处包括模块:global ----> http ------>server -----> location----->rewrite
在这里插入图片描述
7、location /images/abc {}最长字符匹配到/images/abc开头的,优先级最低,继续向下搜索其他location,会发现^存在

8、location ~ /images/abc {}匹配以/images/abc开头的,优先级次之,只要去掉location ……~ /images/ 才会采用这一条

9、location /images/abc/1.html {}匹配/images/abc/1.htrml文件,如果和正则location ~/images/abc/1.html相比,正则优先级更高

10、文件优先级重点Location = 完整路径 > location ^~ 完整路径 > location ~*完整路径 > location ~ 完整路径 > location 完整路径 > location /

11、目录优先级Location = 目录 > location ^~目录 / > location ~ 目录 > location ~* 目录 > location 目录 > location /

12、目录和文件为什么只会在区不区分大小写上有变动正则表达式:目的是为了尽力精确的匹配文件---->尽量精确匹配,区分大小写精确,不区分改为精确目录---->尽量精确匹配,区分大小写精确,优先级更高,不区分大小写

六、语法

1、Rewrite

2、Rewrite [flag]

3、Regex 表示正则表达式

4、Replacement:表示跳转后的内容

5、Flag:表示rewrite支持的flag标记
***重点:Flag标记说明:
1、Last:本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在server和if中2、break:本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在location中
3、Redirect:返回302临时重定向,浏览器地址会显示跳转后的url地址
4、Permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

***注意:last和break最大的不同在于?
1、break 终止当前location的rewrite检测,而且不再进行location匹配
2、Last 终止当前location的rewrite检测,但会继续重试location匹配并处理区块中的rewrite规则

七、location 大致分为三类

1、精准匹配:location = /{…} eg:location = patt {} 精准匹配字符串

2、一般匹配 location / {…} eg:location patt {} 只有包含patt的字符串即可

3、正则匹配 location ~ /{…} eg location ~patt 按照正则表达式的方式匹配

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

1、第一个必选规则直接匹配网站根,通过域名访问网站首页比较频繁(www.baidu.com/),使用这个会加速处理,例如官网。可以是一个静态首页,也可以直接转发给后端“应用服务器”----->PHP.APACHE
在这里插入图片描述
Location = / {Root html;Index index.html index.htm; #第一:耗费资源#第二:加快加载速度}

2、第二个必选规则是处理静态文件请求,这是nginx作为httpd服务器的强项,有俩种配置模式,目录匹配或后缀匹配,任选其一种或搭配使用(强项:1、静态请求处理的能力,高并发处理能力+资源耗费较低)Location ^~ /static/ {Root /webroot/static/;}

3、(重点)第三个必选规则是通用规则,比如用来转发带.php、。Jsp后缀的动态请求到后端应用服务器,非静态文件请求就默认是动态请求(请求/反向代理)Upstream httpd_server { 192.168.199.128:80; 192.168.199.130:80;}Location /{Proxy_pass http://tomcat_server;}
在这里插入图片描述

九、基于域名的跳转

现在公司旧域名www.dog.com有业务需求,需要使用新域名www.cat.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
第一步:添加映射
在这里插入图片描述
第二步: 创建日志目录
在这里插入图片描述
第三步:修改配置文件
在这里插入图片描述

第四步:验证
记得重启服务
在这里插入图片描述

十、基于客户端IP访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP 192.168.199.132访问正常。
第一步:进入NGINX配置
在这里插入图片描述
第二步 测试
记得重启服务
在这里插入图片描述

十一、基于旧域名跳转到新域名后面加目录

当访问的是 http://bbs.dog.com/post/1.html 会自动跳转到 http://www.cat.com/bbs/post/1.html http://bbs.dog.com/post/1.html
第一步:创建指定目录
在这里插入图片描述
第二步:打开配置文件
在这里插入图片描述
第三步:测试
记得重启服务
在这里插入图片描述

十二、基于参数匹配(多余的)的跳转

现在访问 http://www.dog.com/100-(100|200)-100.html 会跳转到 http://www.dog.com的页面第一步:修改设置在这里插入图片描述
第二步:测试记得
重启服务
在这里插入图片描述

十三、基于目录下所有 php 结尾的文件跳转

要求访问http://www.dog.com/upload/123.php 跳转到首页http://www.dog.com
第一步:设置配置文件
在这里插入图片描述

第二步测试
记得重启服务
在这里插入图片描述

十四、基于最普通一条URL请求的跳转

要求访问一个具体的页面,如:http://www.dog.com/abc/123.html,跳转到首页
第一步:配置文件
在这里插入图片描述
第二步测试
在这里插入图片描述

总结

一、Nginx和nginx的优缺点:
apache优点:
1、守护进程相对稳定,重连机制做得好
2、跟php交互基本用module,在php上不用配置太多参数
3、相对nginx,重写(rewrite)支持更好
4、采用module,可拓展性更强,可以在任一阶段插入钩子增加灵活性。
apache缺点:
1、由于使用module形式加载,导致整个项目比较重
2、同步阻塞模型,容易导致进程阻塞无法正常访问
3、新加入的模型event据传性能相当不错,但目前官方称仍属于调试阶段,并不建议在生产环境使用。
nginx优点:
1、异步io处理模型,可以支持更高的并发
2、整体是个轻框架,反向代理一级棒(负载均衡)
3、采用php-fpm fastcgi模式连接php,负载量可以更大
4、定位nginx是做静态页面处理(OSI层应用层HTTP/HTTPS协议),NGINX在第七层工作,静态页面处理3-5万
nginx缺点:
1、守护进程由于给php-fpm做了,所以非常受限于php-fpm。一个输入参数可能会导致整个程序运行不下去
2、php-fpm要额外配置,排查问题多了一个环境需要排查
3、nginx可以执行rewrite,但性能没有apache那么好

二、nginx优化与防盗链
Nginx是企业中运行较多的服务之一,nginx优化,首先是提高用户体验,提供服务端,运行效率和性能

三、nginx rewrite跳转
1、服务体验
2、基于不同场景需求,精准匹配访问的url,指引跳转到合适的新场景
3、nginx rewrite的三种方式
3.1、rewrite
3.2、if
3.3、location4、location 分了匹配方式精准>正则>普通

四、面试题问题:Location的优先顺序是什么
答:
第一是精准匹配;
第二是正则前缀匹配^~;
第三是^和(目录或者文件,如果是目录 ~ 优先级大于 ~,如果是文件,则 ~ 优先级大于 ~)
第四:普通匹配 以xxxx路径为前缀的匹配;
第五:/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值