欢迎来到源码交易网,为站长提供交易担保服务 访问移动版
站长交易首选担保平台!
酷客淘

Nginx 实现 Rewrite 跳转

日期: 2019-10-19 11:09:51 人气: -

本篇主要对于Nginx中的Rewrite跳转进行讲解。因为目前很多工作前端开发都会选择使用Nginx作为反向代理服务器,但是平时业务需要难免碰到重写URL,Nginx的Rewrite跳转有什么使用场景呢?


公司更换域名需要访问旧域名时跳转到新域名

请求静态文件跳转到CDN

根据用户设备不同跳转到不同站点(pc端,移动端)

不得不说的是Apache服务器规则库很强大,做跳转也很简单,但是Nginx使用Rewrite实现跳转效率更高,所以这也是我们需要学习Nginx的Rewrite模块的目的所在。Rewrite是Nginx的静态重写模块,跳转的使用场景有以下几种情形:


可以改变用户访问的URL

可以将动态URL伪装成静态URL提供服务

可以访问旧域名时跳转到新域名

可以根据变量,目录,客户端信息等跳转不同的URL

Rewrite如何实现跳转?


Nginx利用ngxhttprewrite_module模块解析和处理rewrite请求。Rewrite用于实现URL重写,其实有点类似于重定向功能,可以将用户的请求重写至别的目录,在一定程度上提高了网站安全性。Rewrite支持if条件判断,但不支持else判断。而且Rewrite需要PCRE支持,一次重定向最多可以跳转10次,超过10次将返回500错误。Rewrite模块包含set命令,可以创建变量用来记录条件标识或者传递变量到其他的Location中。Rewrite实际上就是使用Nginx已有的全局变量或者通过set命令设置的变量结合正则表达式实现URL重写。


Rewrite使用场景


在Nginx中使用Rewrite实现跳转有以下三种场景:


直接用Rewrite进行匹配跳转

使用if匹配全局变量进行跳转

使用location匹配再进行跳转

所以说rewrite语句只允许放在server{ },if{ },location{ }中。接下来我们先看看if指令。


if指令


if指令用于条件匹配判断,根据判断结果选择不同的Nginx配置,在server或location中配置。Nginx中的if指令只支持单重判断,不支持多重判断。我们简单看个例子:


location /test{


index index.html;


if ( $scheme = http ){


rewrite / https://www.niyueling.cn permanent;


}


if ($scheme = https ){


echo "if ---> $scheme";


}


> }


location上篇文章讲过了,这里不再细讲,接下来我们看下rewrite语法.


rewrite语法


rewrite regex replacement [flag]

rewrite将用户请求的URL基于正则表达式regex进行检查,匹配到时将其替换为正则表达式对应的新的URL。若在同一级配置模块中存在多个rewrite规则,则会自顶向下检查。replacement则为跳转后的内容。[flag]作为标识符用于控制循环机制,如果替换后的URL是以http或者https开头,则会直接301永久重定向。


flag参数介绍


rewrite语句有四种flag状态:redirect、permanent、break、last。前两种属于客户浏览器重新发起对新地址的请求,后两种是在WEB服务器内部实现跳转。


redirect #临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,有客户端重新发起请求,使用相对路径,http://或https://开头,状态码:302

permanent #永久重定向,以永久重定向的方式直接返回重写后生成的新URL给客户端,由客户端重新发起新的请求,状态码:301

last #重写完成后停止对当前location中后续的其他重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用

break #重写完成后停止对当前URL在当前location中后续的其他重写操作,而后直接跳转至重写规则匹配块之后的其他配置;结束循环,建议在location中使用