Nginx 实现 Rewrite 跳转
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。

上一篇文章对Nginx的Location配置进行了讲解,本篇主要对于Nginx中的Rewrite跳转进行讲解。因为目前很多工作前端开发都会选择使用Nginx作为反向代理服务器,但是平时业务需要难免碰到重写URL,Nginx的Rewrite跳转有什么使用场景呢?
- 公司更换域名需要访问旧域名时跳转到新域名
- 请求静态文件跳转到CDN
- 根据用户设备不同跳转到不同站点(pc端,移动端)
不得不说的是Apache服务器规则库很强大,做跳转也很简单,但是Nginx使用Rewrite实现跳转效率更高,所以这也是我们需要学习Nginx的Rewrite模块的目的所在。Rewrite是Nginx的静态重写模块,跳转的使用场景有以下几种情形:
- 可以改变用户访问的URL
- 可以将动态URL伪装成静态URL提供服务
- 可以访问旧域名时跳转到新域名
- 可以根据变量,目录,客户端信息等跳转不同的URL
Rewrite如何实现跳转?
Nginx利用ngx_http_rewrite_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中使用

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可以通过ungx_http_referrer_module模块来检查请求的referer信息是否有效实现防盗链功能
location ^~ /test {
root /opt/blog;
index index.html;
valid_referers none blocked server_names .niyueling.cn www.niyueling.
api.online.test/v1/hostlist ~.google. ~.baidu.; #定义有效的referer
if ($invalid_referer) { #假如是使用其他的无效的referer访问:
return 403; #返回状态码403
}
}
如果喜欢我的文章,欢迎关注我的个人公众号

Nginx 实现 Rewrite 跳转的更多相关文章
- nginx 配置 rewrite 跳转
在访问 test.com 网站时,会自动跳转到 www.test.com ,这是因为该网站做了 URL rewrite 重定向,一般网页重定向跳转分为两种,301 和 302 :301,302 都是H ...
- Nginx常用rewrite跳转重定向实例
1.将www.myweb.com/connect 跳转到connect.myweb.com rewrite ^/connect$ http://connect.myweb.com permanent; ...
- nginx 域名rewrite跳转
转自:http://blog.csdn.net/xingfujie/article/details/7337832 需求:nginx规则,所有对OA.bccom.info的访问,redirect到uc ...
- nginx的rewrite跳转
Rewrite标记flag
- nginx根据条件跳转+跳转规则
好的参考博文: nginx rewrite规则 自己写的时候参考这两个 Nginx 伪静态Rewrite,重定向Location配置总结(转) nginx rewrite规则语法 一.输入子目录跳转 ...
- Nginx的Rewrite规则与实例
通过Rewrite规则可以实现规范的URL.根据变量来做URL转向及选择配置,用好Rewrite有时起到事半功倍的效果. 语法 Nginx的Rewrite相比Apache的要好理解很多,主要使用指令有 ...
- Nginx配置http跳转https访问
Nginx强制http跳转https访问有以下几个方法 nginx的rewrite方法 可以把所有的HTTP请求通过rewrite重写到HTTPS上 配置 方法一 server{ listen ; s ...
- Nginx的rewrite应用
Rewrite主要的功能是实现URL重写,Nginx 的 Rewrite 规则采用 PCRE Perl 兼容正则表达式的语法进行规则匹配,如相使用 Nginx 的 Rewrite 功能,在编译 Ngi ...
- nginx 301 302跳转配置总结
首先看简单的代码示例,关于nginx 301 302跳转的. 301跳转设置: server { listen 80; server_name 123.com; rewrite ^/(.*) http ...
随机推荐
- shell截取小数点前后的子串
- 八核浮点型DSP的双千兆网接口设计方案
千兆网络接口具有数据传输速率快.连接方便.可以即插即用的优点,使得其应用较为广泛.随着电子技术和处理器的发展,很多应用场合的数据通信速率超过千兆网口的实际传输速率.例如,在A/D采样中,需要直接存储A ...
- ansible笔记(三)--模块讲解
ansible 常用命令 ansible-doc ansible-playbook ansible-vault ansible-console ansible-galaxy ansible-pull ...
- Center os6.5设置静态ip
DEVICE="eth0"BOOTPROTO=staticHWADDR="00:0C:29:95:89:35"IPV6INIT="yes"N ...
- 1、pip不是内部运行程序 解决方法
一.方式一 1.切换到pip所在路径: shit+ 右键. 再此处打开运行窗口 2.执行 pip install pytest 脚本即可. 二.方式二,添加环境变量 1.将pip所在的文件路径 添加到 ...
- ARC093F Dark Horse 容斥原理+DP
题目传送门 https://atcoder.jp/contests/arc093/tasks/arc093_d 题解 由于不论 \(1\) 在哪个位置,一轮轮下来,基本上过程都是相似的,所以不妨假设 ...
- [BZOJ3653]谈笑风生 主席树
题面 这道题应该比较裸吧. \(a\),\(b\)都是\(c\)的祖先. 那么第一种情况是\(b\)是\(a\)的祖先,那么方案数就是\(\min\{dep[a]-1,k\}\cdot (num[a] ...
- CF 36E Two Paths
传送门 真实的自闭= =+ 考试的时候老师明明说了可以路径为空T^T 然后光荣的挂掉了 20分的链[明明是最送分的] 上来就看出来欧拉回路了嘛 然后思考了一下大概奇点配个对 删一条简单路径剩下的跑欧拉 ...
- 在windows的文件添加右键"命令提示符"菜单
1\把以下内容保存为reg文件,然后导入 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\she ...
- 【leetcode】1017. Convert to Base -2
题目如下: Given a number N, return a string consisting of "0"s and "1"s that represe ...