本篇主要对于Nginx中的Rewrite跳转进行讲解。因为目前很多工作前端开发都会选择使用Nginx作为反向代理服务器,但是平时业务需要难免碰到重写URL,Nginx的Rewrite跳转有什么使用场景呢?
不得不说的是Apache服务器规则库很强大,做跳转也很简单,但是Nginx使用Rewrite实现跳转效率更高,所以这也是我们需要学习Nginx的Rewrite模块的目的所在。Rewrite是Nginx的静态重写模块,跳转的使用场景有以下几种情形:
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语句只允许放在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将用户请求的URL基于正则表达式regex进行检查,匹配到时将其替换为正则表达式对应的新的URL。若在同一级配置模块中存在多个rewrite规则,则会自顶向下检查。replacement则为跳转后的内容。[flag]作为标识符用于控制循环机制,如果替换后的URL是以http或者https开头,则会直接301永久重定向。
flag参数介绍
rewrite语句有四种flag状态:redirect、permanent、break、last。前两种属于客户浏览器重新发起对新地址的请求,后两种是在WEB服务器内部实现跳转。
rewrite语法讲完了我们可以一起来看看如何实现几种方式跳转:
(1) 在location中将旧域名永久重定向到新域名
location / {
root /data/html;
index index.html;
rewrite / http://www.niyueling.cn permanent;
}
这里有必要提下临时重定向与永久重定向的区别:
临时重定向不会缓存新域名的解析记录,但是永久重定向会缓存新域名的解析记录。
(2) http自动跳转https
有时候公司项目需要,会要求整个网站皆使用https,这时候为了用户体验,我们需要在用户访问http站点的时候自动跳转到https站点中。
location / {
root /opt/blog;
index index.html;
if ( $scheme = http ){
rewrite / https://www.niyueling.cn permanent;
}
}
上面配置其实就是如果用户请求协议为http的时候使用rewrite跳转到对应的https站点。但是if语句不能去掉,否则就会陷入死循环。
(3) 如果用户请求URL不存在跳转首页
location / {root /opt/blog;index index.html;if ( !-f $request_filename ){rewrite (.*) http://www.niyueling.cn;}}
(4) 实现防盗链
防盗链实际上是基于前端携带的referer实现,referer可以记录用户从哪个界面跳转而来的标志信息。Nginx可以通过ungxhttpreferrer_module模块来检查请求的referer信息是否有效实现防盗链功能
location ^~ /test {root /opt/blog;index index.html;validreferers none blocked servernames .niyueling.cn www.niyueling.api.online.test/v1/hostlist ~.google. ~.baidu.; #定义有效的refererif ($invalid_referer) { #假如是使用其他的无效的referer访问:return 403; #返回状态码403}}
如果喜欢我的文章,欢迎关注我的个人公众号
本文由博客一文多发平台 https://openwrite.cn?from=article_bottom 发布!