1.Rewrite基本概述

1.1.什么是rewrite

Rewrite主要实现url地址重写, 以及地址重定向,就是将用户请求web服务器的地址重新定向到其他URL的过程。

1.2.Rewrite使用场景

  • 1.地址跳转,用户访问www.xuliangwei.com/class这个URL时,将其定向至一个新的域名class.xuliangwei.com
  • 2.协议跳转,用户通过http协议请求网站时,将其重新跳转至https协议方式
  • 3.伪静态,将动态页面显示为静态页面方式的一种技术, 便于搜索引擎的录入, 同时减少动态URL地址对外暴露过多的参数, 提升更高的安全性。
  • 4.搜索引擎,SEO优化依赖于url路径, 好记的url便于支持搜索引擎录入

1.3.Rewrite配置示例

#rewrite表达式可以应用在server,location, if标签下
Syntax: rewrite regex replacement [flag];
Default: --
Context: server, location, if #用于切换维护页面场景
#rewrite ^(.*)$ /page/wh.html break;

2.Rewrite标记Flag

rewrite指令根据表达式来重定向URI,或者修改URI字符串。

每行rewrite指令最后跟一个flag标记,支持的flag标记有如下表格所示:

flag
last
break
redirect
permanent

2.1.last与break区别对比示例

[root@bgx conf.d]# cat rewrite.conf
server {
listen 80;
server_name rewrite.oldboy.com;
root /code; location ~ ^/break {
rewrite ^/break /test/ break;
}
location ~ ^/last {
rewrite ^/last /test/ last;
} location /test/ { return 200 'ok';
}
} #重启Nginx服务
[root@bgx conf.d]# systemctl restart nginx

2.2.使用浏览器访问/break测试

2.3.使用浏览器访问/last测试

2.4.last和 break 都是一个作用,都是表示停止rewrite规则,那last和break区别在哪呢

break匹配到规则,则会去本地路径中目录中寻找对应请求的文件。

last匹配到规则,会对其所在的server{...}标签重新发起请求。

所以,在访问/break和/last请求时,虽然对应的请求目录/test都是不存在了,理论上都应该返回404,但是实际请求/last的时候,是会有后面localtion所匹配到的结果返回的,如果last匹配不到location的结果则在返回错误。

2.5.redirect与permanent区别对比示例

[root@Nginx ~]# cat /etc/nginx/conf.d/rewrite.conf
server {
listen 80;
server_name rewrite.oldboy.com;
root /code; location ~ ^/bgx {
rewrite ^(.*)$ https://www.xuliangwei.com redirect;
rewrite ^(.*)$ https://www.xuliangwei.com permanent;
#return 301 http://kt.xuliangwei.com;
#return 302 http://kt.xuliangwei.com;
}
}

2.6.通过浏览器访问,redirect会进行302跳转

2.7.使用 systemctl stop nginx停止nginx,然后再次访问网站测试 redirect

2.8.通过浏览器访问,permanent会进行301跳转

2.9.使用 systemctl stop nginx停止nginx,然后再次访问网站测试 permanent

2.10.redirect和permanent都是一个跳转,那redirect和permanent区别在哪呢

3.Rewrite规则实践

例3.1:用户访问/abc/1.html实际上真实访问是/ccc/bbb/2.html

http://www.bgx.com/abc/1.html ==> http://www.bgx.com/ccc/bbb/2.html

#1.准备真实的访问路径
[root@web03 ~]# mkdir /code/ccc/bbb -p
[root@web03 ~]# echo "ccc_bbb_2" > /code/ccc/bbb/2.html #2.Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf
server {
listen 80; location / {
root /code;
index index.html;
}
location /abc {
rewrite (.*) /ccc/bbb/2.html redirect;
#return 302 /ccc/bbb/2.html;
}
} #3.重启Nginx服务
[root@web03 ~]# systemctl restart nginx

例3.2:用户访问/2018/ccc/bbb/2.html实际上真实访问是/2014/ccc/bbb/2.html

http://www.bgx.com/2018/ccc/bbb/2.html ==> http://www.bgx.com/2014/ccc/bbb/2.html

#1.准备真实的访问路径
[root@web03 ~]# mkdir /code/2014/ccc/bbb -p
[root@web03 ~]# echo "2014_ccc_bbb_2" > /code/2014/ccc/bbb/2.html #2.Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf
server {
listen 80;
location / {
root /code;
index index.html;
}
location /2018 {
rewrite ^/2018/(.*)$ /2014/$1 redirect;
}
} #3.重启Nginx服务
[root@web03 ~]# systemctl restart nginx

例3.3:用户访问/test目录下任何内容, 实际上真实访问是http://www.xuliangwei.com

location /test {
rewrite (.*) http://www.xuliangwei.com redirect;
}

例3.4:用户访问course-11-22-33.html实际上真实访问是/course/11/22/33/course_33.html

http://www.bgx.com/course-11-22-33.html ==> http://www.bgx.com/course/11/22/33/course_33.html

#1.准备真实的访问路径
[root@web03 ~]# mkdir /code/course/11/22/33/ -p
[root@web03 ~]# echo "Curl docs.etiantian.org" > /code/course/11/22/33/course_33.html #2.Nginx跳转配置
[root@web03 conf.d]# cat ccbb.conf
server {
listen 80;
root /code;
index index.html;
location / {
#灵活
rewrite ^/course-(.*)-(.*)-(.*).html$ /course/$1/$2/$3/course_$3.html redirect;
#固定
#rewrite ^/course-(.*) /course/11/22/33/course_33.html redirect;
} #3.重启Nginx服务
[root@web03 ~]# systemctl restart nginx

例3.5:将http请求,跳转至https

server {
listen 80;
server_name bgx.com;
rewrite ^(.*) https://$server_name$1 redirect;
#return 302 https://$server_name$request_uri;
} server {
listen 443;
server_name bgx.com;
ssl on;
}

4.Rewrite规则补充

4.1.Rewrite优先级

  • 1.先执行server块的rewrite指令
  • 2.其次执行location匹配规则
  • 3.最后执行location中的rewrite

4.2.Rewrite常用变量,在匹配过程中可以引用一些Nginx的全局变量

\(server_name 当前用户请求的域名
\)request_filename 当前请求的文件路径名(带网站的主目录/code/images/test.jpg)

\(request_uri 当前请求的文件路径名(不带网站的主目录/images/test.jpg)
\)scheme用的协议,比如http或者https

4.3.如何优雅的书写Rewrite规则

server {
listen 80;
server_name www.oldboyedu.com oldboyedu.com;
if ($http_host = oldboyedu.com){
rewrite (.*) http://www.nginx.org$1;
}
} #推荐的书写格式
server {
listen 80;
server_name oldboyedu.com;
rewrite ^ http://www.oldboyedu.com$request_uri;
} server {
listen 80;
server_name www.oldboyedu.com;
}

16、Nginx Rewrite重写的更多相关文章

  1. nginx rewrite重写与防盗链配置

    nginx rewrite重写规则与防盗链配置方法 时间:2016-02-04 15:16:58来源:网络 导读:nginx rewrite重写规则与防盗链配置方法,rewrite规则格式中flag标 ...

  2. nginx rewrite重写

    通过官方文档可以看到,rewrite的作用上下文是   server location,可以写在 server里面  亦或location里面; 命令: if (条件) {} 条件判断 set #设置 ...

  3. 09 nginx Rewrite(重写)详细解析

    一:Rewrite(重写)详细解析 rewrite 重写 重写中用到的指令 if  (条件) {}  设定条件,再进行重写 set #设置变量 return #返回状态码 break #跳出rewri ...

  4. nginx之rewrite重写,反向代理,负载均衡

    rewrite重写(伪静态): 在地址栏输入xx.com/user-xxx.html, 实际上访问的就是xxx.com/user.php?id=xxx rewrite就这么简单 附上ecshop re ...

  5. 04 . Nginx的Rewrite重写

    Rewrite简介 # Rewrite对应URL Rewrite,即URL重写,就是把传入web的请求重定向到其他URL的过程. # 当运维遇到要重写情况时,往往是要程序员把重写规则写好后,发给你,你 ...

  6. 第十七章 nginx动静分离和rewrite重写

    一.动静分离 动静分离,通过中间件将动静分离和静态请求进行分离:通过中间件将动态请求和静态请求分离,可以减少不必要的请求消耗,同时能减少请求的延时.通过中间件将动态请求和静态请求分离,逻辑图如下: 1 ...

  7. Nginx – rewrite 配置 URL重写及301跳转原理图

    Nginx – rewrite 配置 URL重写 官网:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html 语法:rewrite re ...

  8. Nginx rewrite(重写)

    Nginx Rewrite规则相关指令  Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx Re ...

  9. Nginx URL重写(rewrite)配置及信息详解

    URL重写有利于网站首选域的确定,对于同一资源页面多条路径的301重定向有助于URL权重的集中 Nginx URL重写(rewrite)介绍 和apache等web服务软件一样,rewrite的组要功 ...

随机推荐

  1. JMeter4.0分布式调度压测部署

    我们在Loadrunner学过使用Load Generator做肉鸡, 通过Controller来进行脚本和权重的分配来进行分布式压测, Jmeter作为当今的网红性能测试工具,这个功能必须是少不了的 ...

  2. html 网页源码解析:bs4中BeautifulSoup

    from bs4 import BeautifulSoup result=requests.request("get","http://www.baidu.com&quo ...

  3. 小D课堂 - 零基础入门SpringBoot2.X到实战_第11节 Logback日志框架介绍和SpringBoot整合实战_45、SpringBoot2.x日志讲解和Logback配置实战

    笔记 2.SpringBoot2.x日志讲解和自定义Logback配置实战     简介:讲解SpringBoot2.x整合Logback配置实战 1.官网介绍:https://docs.spring ...

  4. boost::multi_index 提供一种千人在线即时排行榜的设计思路

    原文地址: http://www.limerence2017.com/2019/06/23/cpp01/ 做游戏或金融后台开发,经常会遇到设计开发排行榜的需求.比如玩家的充值排行,战力排行等等.而这种 ...

  5. 03 vue项目结构

    上一篇已介绍根据vue-cli创建项目,本篇介绍根据vue-cli官方脚手架创建的项目的项目结构. 一.图看结构 build  [webpack配置]         webpack相关配置,都已经配 ...

  6. 云计算共享组件--时间同步服务NTP(2)

    一.标准时间讲解 地球分为东西十二个区域,共计 24 个时区 格林威治作为全球标准时间即 (GMT 时间 ),东时区以格林威治时区进行加,而西时区则为减. 地球的轨道并非正圆,在加上自转速度逐年递减, ...

  7. C#中StringBuilder类的使用总结

    String 对象是不可改变的.每次使用 System.String 类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需要对字符串执行重复修改的情况下,与创建新 ...

  8. deepin与win10 设置共享文件

    在做预料训练时用的是基于linux环境下的kenlm训练工具,然后当时发现woc? 这这这这训练出来的语言模型居然拖不到win10下使用......当时特别二,就在linux下登录邮箱给自己发邮件23 ...

  9. ASP.NET Core EFCore 之Code First

    1.在.NET Core项目中使用Nuget引用包 Sql Server 请安装 Microsoft.EntityFrameworkCore.SqlServer 2.添加实体类 [Table(&quo ...

  10. Mysql优化深度解析

    说起MySQL的查询优化,相信大家收藏了一堆奇技淫巧:不能使用SELECT *.不使用NULL字段.合理创建索引.为字段选择合适的数据类型..... 你是否真的理解这些优化技巧?是否理解其背后的工作原 ...