您当前的位置:首页 > 电脑百科 > 站长技术 > 服务器

Nginx 实现 Rewrite 跳转

时间:2019-10-18 17:00:29  来源:  作者:

 

 

本篇主要对于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中使用
Nginx 实现 Rewrite 跳转

 

  •  

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 发布!



Tags:Nginx Rewrite   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本篇主要对于Nginx中的Rewrite跳转进行讲解。因为目前很多工作前端开发都会选择使用Nginx作为反向代理服务器,但是平时业务需要难免碰到重写URL,Nginx的Rewrite跳转有什么使...【详细内容】
2019-10-18  Tags: Nginx Rewrite  点击:(117)  评论:(0)  加入收藏
▌简易百科推荐
阿里云镜像源地址及安装网站地址https://developer.aliyun.com/mirror/centos?spm=a2c6h.13651102.0.0.3e221b111kK44P更新源之前把之前的国外的镜像先备份一下 切换到yumcd...【详细内容】
2021-12-27  干程序那些事    Tags:CentOS7镜像   点击:(1)  评论:(0)  加入收藏
前言在实现TCP长连接功能中,客户端断线重连是一个很常见的问题,当我们使用netty实现断线重连时,是否考虑过如下几个问题: 如何监听到客户端和服务端连接断开 ? 如何实现断线后重...【详细内容】
2021-12-24  程序猿阿嘴  CSDN  Tags:Netty   点击:(12)  评论:(0)  加入收藏
一. 配置yum源在目录 /etc/yum.repos.d/ 下新建文件 google-chrome.repovim /etc/yum.repos.d/google-chrome.repo按i进入编辑模式写入如下内容:[google-chrome]name=googl...【详细内容】
2021-12-23  有云转晴    Tags:chrome   点击:(7)  评论:(0)  加入收藏
一. HTTP gzip压缩,概述 request header中声明Accept-Encoding : gzip,告知服务器客户端接受gzip的数据 response body,同时加入以下header:Content-Encoding: gzip:表明bo...【详细内容】
2021-12-22  java乐园    Tags:gzip压缩   点击:(9)  评论:(0)  加入收藏
yum -y install gcc automake autoconf libtool makeadduser testpasswd testmkdir /tmp/exploitln -s /usr/bin/ping /tmp/exploit/targetexec 3< /tmp/exploit/targetls -...【详细内容】
2021-12-22  SofM    Tags:Centos7   点击:(7)  评论:(0)  加入收藏
Windows操作系统和Linux操作系统有何区别?Windows操作系统:需支付版权费用,(华为云已购买正版版权,在华为云购买云服务器的用户安装系统时无需额外付费),界面化的操作系统对用户使...【详细内容】
2021-12-21  卷毛琴姨    Tags:云服务器   点击:(6)  评论:(0)  加入收藏
参考资料:Hive3.1.2安装指南_厦大数据库实验室博客Hive学习(一) 安装 环境:CentOS 7 + Hadoop3.2 + Hive3.1 - 一个人、一座城 - 博客园1.安装hive1.1下载地址hive镜像路径 ht...【详细内容】
2021-12-20  zebra-08    Tags:Hive   点击:(9)  评论:(0)  加入收藏
以下是服务器安全加固的步骤,本文以腾讯云的CentOS7.7版本为例来介绍,如果你使用的是秘钥登录服务器1-5步骤可以跳过。1、设置复杂密码服务器设置大写、小写、特殊字符、数字...【详细内容】
2021-12-20  网安人    Tags:服务器   点击:(7)  评论:(0)  加入收藏
项目中,遇到了一个问题,就是PDF等文档不能够在线预览,预览时会报错。错误描述浏览器的console中,显示如下错误:nginx代理服务报Mixed Content: The page at ******** was loaded...【详细内容】
2021-12-17  mdong    Tags:Nginx   点击:(7)  评论:(0)  加入收藏
转自: https://kermsite.com/p/wt-ssh/由于格式问题,部分链接、表格可能会失效,若失效请访问原文密码登录 以及 通过密钥实现免密码登录Dec 15, 2021阅读时长: 6 分钟简介Windo...【详细内容】
2021-12-17  LaLiLi    Tags:SSH连接   点击:(16)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条