当前位置: 首页 > 后端技术 > Node.js

Nginx实现重写跳转

时间:2023-04-03 16:10:41 Node.js

文章最初发表于公众号:程序员周先森。本平台不定期更新,喜欢我的文章,请关注我的微信公众号。上一篇文章讲解了Nginx的Location配置,本文主要讲解Nginx中的Rewrite跳转。因为目前很多前端开发者都选择使用Nginx作为反向代理服务器,但是通常业务需求难免会遇到重写URL。Nginx的Rewrite重定向有哪些使用场景?当公司更换域名,需要访问旧域名时,需要跳转到新域名,请求静态文件跳转到CDN。根据用户的设备跳转到不同的站点(pc端、移动端)。不得不说Apache服务器规则库非常强大。传输也很简单,但是Nginx使用Rewrite实现跳转效率更高,所以这也是我们需要学习Nginx的Rewrite模块的原因。Rewrite是Nginx的静态改写模块。跳转的使用场景有:可以改变用户访问的URL,动态URL伪装成静态URL提供服务,访问旧域名跳转到新域名。根据变量、Directory、客户端信息等,如何跳转到不同的URLRewrite?Nginx使用ngx_http_rewrite_module模块来解析和处理重写请求。Rewrite用于实现URL重写。其实有点类似于重定向功能。它可以将用户的请求重写到另一个目录,在一定程度上提高了网站的安全性。Rewrite支持if条件判断,不支持else判断。此外,Rewrite需要PCRE支持。一个重定向最多可以跳转10次,超过10次就会返回500错误。Rewrite模块包含set命令,可以创建变量来记录条件标志或将变量传递给其他位置。Rewrite实际上是利用Nginx已有的全局变量或者通过set命令结合正则表达式设置的变量来实现URL重写。Rewrite使用场景在Nginx中使用Rewrite实现跳转有三种场景:直接使用Rewrite匹配跳转使用if匹配全局变量进行跳转使用location匹配跳转所以rewrite语句只允许放在服务器{},如果{},位置{}。接下来,让我们看一下if指令。if命令if命令用于条件匹配判断,根据判断结果选择不同的Nginx配置,配置到server或location。Nginx中的if命令只支持单判断,不支持多判断。我们来看一个例子:location/test{>indexindex.html;if($scheme=http){rewrite/https://www.niyueling.cn永久;}if($scheme=https){echo"if--->$scheme";}}location在上一篇文章中提到过,这里不再赘述。接下来,让我们看一下重写语法。rewrite语法rewriteregexreplacement[flag]rewrite将用户请求的URL基于正则表达式regex检查并在匹配时替换为正则表达式对应的新URL。如果同级配置模块中有多个rewrite规则,则从上到下依次检查。replacement是跳转后的内容。[flag]用作控制循环机制的标识符。如果被替换的URL以http或者https开头,会直接301永久重定向。flag参数介绍rewrite语句有四种标志状态:redirect、permanent、break、last。前两种属于客户端浏览器重新发起对新地址的请求,后两种是实现WEB服务器内部的跳转。redirect#临时重定向,重写完成后,将重写后生成的新URL以临时重定向的方式直接返回给客户端,客户端重新发起请求,使用相对路径,以http://开头orhttps://,Statuscode:302permanent#永久重定向,直接将重写后生成的新URL以永久重定向的形式返回给客户端,客户端会重新发起新的请求,statuscode:301last#停止更新重写完成后的当前位置在其他后续重写操作中,然后对新的URL开始新一轮的重写检查,不建议在该位置使用break#重写完成后,停止其他后续重写操作当前位置的当前URL,然后在重写规则匹配块后直接跳转到其他配置;结束循环,建议使用location中的rewrite语法直接到新域名location/{root/data/html;indexindex.html;rewrite/http://www.niyueling.cnpermanent;}这里有必要提一下临时重定向和永久重定向的区别:临时重定向不会缓存新域名的解析记录,而永久重定向会缓存新域名的解析记录。(2)http自动跳转到https有时候公司的项目需要要求整个网站都使用https。这时候为了用户体验,我们需要在用户访问http站点的时候自动跳转到https站点。location/{root/opt/blog;indexindex.html;if($scheme=http){rewrite/https://www.niyueling.cnpermanent;}}上面的配置实际是在用户请求协议为httprewrite跳转到对应的https站点时使用的。但是if语句不能去掉,否则会陷入死循环。(3)如果用户请求的URL不存在,则跳转到首页位置/{root/opt/blog;indexindex.html;if(!-f$request_filename){rewrite(.*)http://www.niyueling.cn;}}(4)防盗链的实现防盗链实际上是基于前端携带的referer。referer可以记录用户从哪个界面跳转过来的logo信息。Nginx可以使用ungx_http_referrer_module模块检查请求的referer信息是否有效,实现防盗链功能location^~/test{root/opt/blog;indexindex.html;valid_referersnoneblockedserver_names.niyueling.cnwww.niyueling.api.在线。测试/v1/主机列表~\.google\.~\.百度\.;#Definevalidrefererif($invalid_referer){#如果使用其他无效的referer访问:return403;#返回状态码403}}如果喜欢我的文章,欢迎关注我的简介公众号