rewrite 重写跳转

news2024/11/19 8:39:50

Nginx Rewrite–重写跳转

Nginx Rewrite--重写跳转

  • 一、概述:
    • 1.Rewrite 跳转场景:
    • 2.Rewrite 跳转实现:
    • 3.Rewrite 实际场景:
    • 4.Nginx正则表达式:
    • 5.Rewrite 命令:
    • 6.location分类:
    • 7.比较rewrite和location:
  • 二、实际操作运用:
    • 1.rewrite示例:
  • 三、总结:
    • 1.本章掌握:
    • 2.实操中遇到的问题:
    • 3.rewrite和location:

一、概述:

1.Rewrite 跳转场景:

(1)URL看起来更规范,合理。

① URL:指的是一个具体的路径/位置。

② URI:一个拥有相同类型/特性的对象集合。

③ URN:用名称定位。

(2)企业会将动态URL地址伪装成静态地址提供服务。

(3)网址换新域名后,让旧的访问跳转到新的域名上。

(4)服务端某些业务调整。

2.Rewrite 跳转实现:

(1)实现过程:

在这里插入图片描述

3.Rewrite 实际场景:

(1)Nginx跳转需求的实现方式:

①使用rewrite进行匹配跳转(防盗链)

②使用if匹配全局变量后调整(CentOS系统的全局变量,不是Nginx本身全局变量)

③使用location匹配再跳转(匹配的访问URL路径,location可匹配本地重写以及垮服务器跳转)

(2)rewrite在server {},if {},location {}段中

location只对域名后的除去传递参数外的字符串起作用

(3)对域名或参数字符串

① 使用if全局变量

② 使用proxy_pass反向代理

4.Nginx正则表达式:

(1)常用正则表达式元字符:

字符说明
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
?匹配前面的字符零次或一次
.匹配除“\n”之外的任何单个字符
\将后面接的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d匹配纯数字
{n}重复n次
{n,}重复n次或更多次
{c}匹配单个字符c
[a-z]匹配a-z小写字母任意一个
[a-zA-Z]匹配(a-z)小写或(A-Z)大写字母中任意一个
()表达式的开始和结束位置
|或运算符

(2)小结:

从功能看,rewrite和location有点像,都能实现跳转。主要区别在于:

① rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器。

② rewrite 对访问的域名或者域名内的URL路径地址重写

③ location对访问的路径做访问控制或者代理转发

5.Rewrite 命令:

(1)命令语法:

rewrite <regex> 正则 <replacement> 跳转后内容 [flag];(rewrite 支持的flag标记)

(2)flag标记说明:

标记说明
last相当于Apache的[l]标记,表示完成rewrite。
break本条规则匹配完成即终止,不再匹配新的规则。
redirect返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新URL。
permanent返回301永久重定向,浏览器地址会显示跳转后的URL地址,爬虫会更新URL。
  • 标记总结:

① break和last类似,但不会重新发起一次处理过程,而是直接返回结果。

② redirect:该标记表示当前规则匹配成功后,立即进行重定向操作。

③ permanent:该标记和redirect类似,但它是永久重定向。

④ set:表示当前规则匹配成功设置一个变量,并把变量传入下一条规则。

(3)last和break比较:

lastbreak
使用场景一般写在server和if中一般使用在location中
URL匹配不终止重写后的URL匹配终止重写后的URL

6.location分类:

(1)分类:

精确匹配:location = / {…}

一般匹配:location / {…}

正则匹配:location ~ / {…}

(2)正则匹配的常用表达式:

标记说明
~执行一个正在匹配,区分大小写
~*执行一个正在匹配,不区分大小写
!~执行一个正在匹配,区分大小写,不匹配
!~*执行一个正在匹配,不区分大小写,不匹配
^~普通字符匹配,使用前缀匹配。如匹配成功,则不再匹配其他location
=普通字符精确匹配,完全匹配
@定义一个命名的location,使用在内部定向时

(3)location优先级:

首先精确匹配=

其次前缀匹配 ^~

其次是按文件中顺序的正则匹配 *

然后匹配不带任何修饰的前缀匹配

最后是交给 /通用匹配

(4)location实例:

① location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配,再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。

② location / {}
因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,但若后面是正则表达式会和最长字符串优先匹配(最长匹配)

③ location /documents/ {}
匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location,只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

④ location /documents/abc {}
匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location,只有其它 location后面的正则表达式没有匹配到时,才会采用这一条

⑤ location ^~ /images/ {}
匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条

⑥ location ~* .(gif|jpg|jpeg)$ {}
匹配所有以 gif、jpg或jpeg 结尾的请求。然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则。

⑦ location /images/abc {}
最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在

⑧ location ~ /images/abc {}
匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条

⑨ location /images/abc/1.html {}
匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

(5)小结:

① (location=完整路径)>(location ^~ 路径)>(location,*正则顺序)>(location不分起始路径)>(location /)

② location匹配:

首先看 优先级:精确= > 前缀^~ > 正则,* > 一般 > 通用/

优先级相同:正则看上下顺序,上面的优先,一般匹配看长度,最长匹配的优先

精确,前缀,正则,一般 都没有匹配到,最后在看通用匹配

(6)实际网站使用中,至少有三个匹配规则定义:

① 第一个必选规则:
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。可以是一个静态首页,也可以直接转发给后端应用服务器
location = / {
root html;
index index.html index.htm;
}

② 第二个必选规则:

处理静态文件请求,这是nginx作为http服务器的强项。有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}

location ~* .(html|gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}

③ 第三个规则就是通用规则:

用来转发带.php、.jsp后缀的动态请求到后端应用服务器,非静态文件请求就默认是动态请求。
location / {
proxy_pass http://tomcat_server;
}

7.比较rewrite和location:

(1)相同点:都能实现跳转。

(2)不同点:

① rewrite是同一域名内更改获取资源的路径。

② location是对同一路径做控制访问或反向代理,还可以proxy_pass到其他机器。

(3)rewrite写在location里,执行顺序:

① 执行server块里的rewrite指令

② 执行location匹配

③ 执行选定的location中的rewrite指令

(4)rewrite和location比较:

① rewrite会改写访问URL路径(被访问的HTML/HTM/CSS文件)

② location对一类地址进行权限控制(认证控制)+跳转(跨服务器进行URL跳转)

二、实际操作运用:

1.rewrite示例:

(1)基于域名跳转:

  • 要求:现在公司旧域名www.exo.com有业务需求变更,需要使用新域名www.bkpp.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
[root@wang3 conf]# vim /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  www.exo.com;  #域名修改

        charset utf-8;

        access_log  logs/www.exo.com-access.log;  #日志修改

        location / {  #添加域名重定向
           if ($host = 'www.exo.com'){  #$host为rewrite全局变量,代表请求主机头字段或主机名
           rewrite ^/(.*)$ http://www.bkpp.com/$1 permanent; #$1为正则匹配的内容,即“域名/”之后的字符串
           }
            root   html;
            index  index.html index.htm;
        }
[root@wang3 conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@wang3 conf]# echo "192.168.174.15 www.exo.com www.bkpp.com" >> /etc/hosts
[root@wang3 conf]# systemctl restart nginx.service

在这里插入图片描述

在这里插入图片描述

(2)基于客户端 IP 访问跳转:

公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.174.15访问正常。

[root@wang3 conf]# vim /usr/local/nginx/conf/nginx.conf
access_log  logs/www.exo.com-access.log;
        set $rewrite true;  #设置变量$rewrite,变量值为boole值true
        if ($remote_addr = "192.168.174.15"){  #当客户端IP为192.168.174.15时,将变量值设为false,不进行重写
          set $rewrite false;
    }   #除了合法IP,其它都是非法IP,进行重写跳转维护页面
         if ($rewrite = true){  #当变量值为true时,进行重写
        rewrite (.+) /sehun.html; #将域名后边的路径重写成/sehun.html,例如www.exo.com/sehun.html
        }
        location = /sehun.html {
        root /var/www/html;  ##网页返回/var/www/html/sehun.html的内容
        }
[root@wang3 conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@wang3 html]# mkdir -p /var/www/html/
[root@wang3 html]# echo '<h1>Shimmie Shimmie Ko Ko Bop I think I like it!</h1>' > /var/www/html/sehun.html 
[root@wang3 html]# systemctl restart nginx

在这里插入图片描述

在这里插入图片描述

(3)基于旧域名跳转到新域名后面加目录:

现在访问的是 http://bbs.exo.com/post/,现在需要将这个域名下面的访问都跳转到http://www.exo.com/bbs/post/

[root@wang3 html]# vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  bbs.exo.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.exo.com-access.log;
	#添加
	location /post {
        rewrite (.+) http://www.exo.com/bbs/$1 permanent;		#这里的$1为位置变量,代表/post
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}
[root@wang3 html]# mkdir -p /usr/local/nginx/html/bbs/post
[root@wang3 html]# echo "this is 1.html"  >> /usr/local/nginx/html/bbs/post/1.html
[root@wang3 html]# echo "192.168.174.15 bbs.exo.com www.exo.com"  >> /etc/hosts
[root@wang3 html]# systemctl restart nginx

在这里插入图片描述

(4)基于参数匹配的跳转:

现在访问http://www.exo.com/100-(100|200)-100.html 跳转到http://www.exo.com页面。

[root@wang3 post]# vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.kgc.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kgc.com-access.log;
	
	if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.+) http://www.kgc.com permanent;
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}
[root@wang3 post]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@wang3 post]# systemctl restart nginx.service 
  • 使用浏览器访问 http://www.exo.com/100-200-100.html 跳转到http://www.exo.com页面。

在这里插入图片描述

(5)基于目录下所有 php 结尾的文件跳转:

要求访问 http://www.exo.com/upload/123.php 跳转到首页。

[root@wang3 post]# vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.exo.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kgc.com-access.log;
	
	location ~* /upload/.*\.php$ {
        rewrite (.+) http://www.exo.com permanent;
    }
    
	location / {
        root   html;
        index  index.html index.htm;
    }
}
[root@wang3 post]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@wang3 post]# systemctl restart nginx.service
  • 浏览器访问 http://www.exo.com/upload/123.php 跳转到http://www.exo.com页面。

在这里插入图片描述

(6)基于最普通一条 url 请求的跳转:

要求访问一个具体的页面如 http://www.exo.com/abc/123.html 跳转到首页

[root@wang3 post]# vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.exo.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.exo.com-access.log;
	
    location ~* ^/abc/123.html {
        rewrite (.+) http://www.exo.com permanent;
    }


	location / {
        root   html;
        index  index.html index.htm;
    }
}
[root@wang3 post]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@wang3 post]# systemctl restart nginx.service

访问一个具体的页面如 http://www.exo.com/abc/123.html 跳转到首页

在这里插入图片描述

三、总结:

1.本章掌握:

(1)跳转场景,跳转实现,nginx正则表达式,rewrite语法格式。

(2)last,break,permanent,redirect标记说明。

(3)location分类,优先级,location和rewrite比较。

2.实操中遇到的问题:

(1)Nginx服务无法启动。

  • 解决方案:关闭防火墙,安全机制。

(2)网页正常跳转,但显示无法找到路径。

  • DNS重释,

3.rewrite和location:

(1)rewrite指令允许对 URL 进行转换或修改。当 Nginx 收到一个请求时,会检查请求的 URI 是否与 rewrite 指令匹配,如果是,则这个 URI 将被重写为一个新的 URI。这个重写后的 URI 将被用于后续的处理。

(2)location指令用于匹配 HTTP 请求的 URI。当 Nginx 收到一个请求时,会检查请求的 URI 是否与 location 指令匹配。如果匹配,则该指令块中的指令将被执行。 location指令通常用于配置网站页面和后端服务的访问规则、安全设置等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/691758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FFmpeg实战】音视频解封装格式

转载自原文地址&#xff1a;https://www.cnblogs.com/zuojie/p/16798273.html 一、什么是封装格式 封装格式也称为容器&#xff0c;用于打包音频、视频以及字幕等等&#xff0c;比如常见的容器有MP4、MOV、WMV、FLV、AVI、MKV等等。容器里面装的是音视频的压缩帧&#xff0c;但…

5、基于Python所写的飞机大战设计

点击以下链接获取源码资源&#xff1a; https://download.csdn.net/download/qq_64505944/87953348?spm1001.2014.3001.5503 《彩图版飞机大战》程序使用说明 在PyCharm中运行《彩图版飞机大战》即可进入如图1所示的游戏界面。 图1 游戏主界面 具体的操作步骤如下&#xff…

ASEMI代理NXP可控硅BT139-600E参数,BT139-600E规格

编辑-Z BT139-600E参数描述&#xff1a; 型号&#xff1a;BT139-600E 断态重复峰值电压VDRM&#xff1a;600V RMS导通电流IT(RMS)&#xff1a;16A 非重复峰值导通电流ITSM&#xff1a;155A 峰值栅极电流IGM&#xff1a;2A 峰值栅极功率PGM&#xff1a;5W 储存温度Tstg&…

C++进阶—二叉搜索树Key、Key-Value模型应用及二叉树OJ(非递归实现遍历)

目录 1、二叉树搜索模型实现及应用场景 1. 二叉搜索树Key模型及其应用 2. 二叉搜索树Key-Value模型及其应用 2、二叉树OJ 2.1 根据二叉树创建字符串 2.2 二叉树的层序遍历I 2.3 二叉树的层序遍历II 2.4 二叉树的最近公共祖先 2.5 二叉搜索树及双向链表 2.6 从前序与中…

想学芯片专业?一文讲清楚芯片报考指南

2021年清北相继成立集成电路学院之后&#xff0c;国内在电子方面有实力积累的高校纷纷跟进&#xff0c;设立集成电路学院、开设集成电路相关专业。 直到今年&#xff0c;高校在集成电路方面的投入和培养力度&#xff0c;仍在持续并越来越大。 就在今年&#xff0c;示范性28所…

CDN是什么?

81. CDN是什么&#xff1f; CDN&#xff08;Content Delivery Network&#xff09; 即内容分发网络&#xff0c;是一种分布式的网络架构&#xff0c;旨在提高用户获取内容的速度、可用性和安全性。CDN通过将内容部署到全球各个节点服务器&#xff0c;并根据用户的地理位置将内…

有关软件检测实验室检测报告的全部知识点盘点

检测报告是实验室检测成果的重要载体&#xff0c;也是软件检测实验室质量管理水平的一个重要体现&#xff0c;本文我们就一起来看一下&#xff0c;软件检测实验室在申请cnas测试认证时&#xff0c;应该如何规范实验室的检测报告。 首先我们一起来看一下&#xff0c;cnas官方对…

记编译 Doris 的过程

目录 概述 1、关于clang 2、链接静态库的问题 3、 cmake的知识 4、关于nm 5、关于 ABI 6、关于debug info 概述 尝试编译 doris&#xff0c;其过程异常坎坷&#xff0c;不过也学到了很多东西。 首先&#xff0c;按照doris官网上的编译指导&#xff0c;下载ldb_toolchai…

python图像处理实战(三)—图像几何变换

&#x1f680;写在前面&#x1f680; &#x1f58a;个人主页&#xff1a;https://blog.csdn.net/m0_52051577?typeblog &#x1f381;欢迎各位大佬支持点赞收藏&#xff0c;三连必回&#xff01;&#xff01; &#x1f508;本人新开系列专栏—python图像处理 ❀愿每一个骤雨初…

Vue实例知识点分享

文章目录 导文下面是创建 Vue 实例的基本步骤 常用的 Vue 实例方法和属性总结 导文 Vue的实例是用来创建 Vue 应用程序的对象。通过实例化 Vue 构造函数&#xff0c;我们可以创建一个具有响应式数据、计算属性、方法和生命周期钩子等特性的 Vue 实例。 下面是创建 Vue 实例的基…

springDatajpa动态sql根据时间范围将数据导出为excel并使用vue的按钮去触发

用到的技术点&#xff1a; 1.springDatajpa 2.EasyExcel 3.数据库 4.vue 前端实现&#xff1a; 1.创建按钮&#xff08;点击此按钮弹出填写导出条件的弹出框&#xff09; <el-button type"primary" round click"dialogVisible true"><svg-icon …

Java如何实现分库分表

一、为啥要分库分表 在大型互联网系统中&#xff0c;大部分都会选择mysql作为业务数据存储。一般来说&#xff0c;mysql单表行数超过500万行或者单表容量超过2GB&#xff0c;查询效率就会随着数据量的增长而下降。这个时候&#xff0c;就需要对表进行拆分。 那么应该怎么拆分…

vite项目中处理各种静态资源的引入方式介绍

一、引用图片资源 在vite创建的vue3项目中&#xff0c;引用图片资源有以下两种方式&#xff1a; 直接在模板中使用路径引用&#xff1a;在模板中使用标签&#xff0c;通过src属性引用图片。例如&#xff1a; <template><div><img src"./assets/logo.png…

NetApp FAS 存储管理软件,海量非结构化数据存储

NetApp FAS 存储管理软件&#xff0c;海量非结构化数据存储 在 NetApp ONTAP 数据管理软件的支持下&#xff0c;帮助您构建简单、安全且值得信赖的存储基础架构。NetApp FAS 存储阵列可让客户同时兼顾性能和容量。 NetApp FAS 系统经过优化&#xff0c;易于部署和操作&#x…

记录ip段解析成ip

无脑记录者记录使用方法 1.源代码链接 https://github.com/codeexpress/cidr2ip 2.提前准备的内容 go开发语言&#xff0c;链接里面的main.go 3.使用方法 直接新增文件cidrs.txt cidrs.txt文件里面加入需要解析的ip段即可

【实战】 JWT、用户认证与异步请求(上) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(四)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求1.login2.middleware of json-server3.jira-dev-tool&#xff08;imooc-jira-tool&#xff09;安装问…

机器学习——自然语言处理(一)

1 分词 1.1 设计原则 切分粒度大&#xff1b;非字典词少、单字字典词少&#xff1b;总体次数少。 1.2 基于词典匹配的分词 1.3 基于语法和规则的分词 目前处在试验阶段 1.4 基于统计的分词 1.5 技术难点 1.5.1 歧义识别 交集型歧义&#xff1a;AB | C or A | BC 组合型…

Jmeter操作数据库运行提示“Cannot load JDBC driver class ‘com.mysql.jdbc.Driver‘”的有效解决

如图所示&#xff0c;在jmeter中运行sql时报错提示“Cannot load JDBC driver class com.mysql.jdbc.Driver” 原因分析&#xff1a;这是因为没有mysql驱动&#xff0c;需要下载对应的jar包 一、下载地址&#xff1a;MySQL :: Download Connector/J 根据需求选择下载&#xf…

数字化转型:智慧物业行业落地与应用的突围之路!

导语 | 红杉中国在《2021 年企业数字化年度指南》中指出&#xff0c;96% 的受访企业已经开展了数字化实践&#xff0c;而其中超过 6 成的受访者都表示期望在未来进一步增加数字化的投入。技术因素或将成为未来两到三年影响企业发展最为重要的外部力量。当前地产与物业行业进入不…

当前最强的免费AI画图、AI绘图工具-2

Midjourney比较贵&#xff0c;而且无法访问&#xff0c;Stable Diffusion部署起来很麻烦。网上有哪些可以直接在网页端或者下载的app可以实现AI画图的工具。我们整理了45个相关工具&#xff0c;这是系列2&#xff0c;收录到 当前最强的免费AI画图、AI绘图工具-2https://www.web…