Nginx Rewrite 重写跳转

news2024/11/17 14:41:48

文章目录

  • 一.Nginx Rewrite概述
    • 1.Rewrite跳转场景
    • 2.Rewrite跳转场景
    • 3.Rewrite跳转实现
    • 4.Rewrite实际场景
      • 4.1Nginx跳转需求的实现方式
      • 4.2 rewrite放在 server{},if{},location{} 段中
      • 4.3对域名或参数字符串
    • 5.nginx正则表达式
      • 5.1 常用的正则表达式元字符
    • 6.Rewrite 命令
      • 6.1 Rewrite 命令语法
      • 6.2flag标记说明
      • 6.3last和break比较
  • 二.location
    • 1.location分类
      • 1.1精确匹配
      • 1.2一般匹配
      • 1.3正则匹配
    • 2.正则匹配的常用的表达式
    • 3.location优先级
    • 4.location示例
    • 5.实际网站使用中,至少有三个匹配规则定义
      • 5.1第一个必选规则
      • 5.2第二个必选规则
      • 5.3第三个规则就是通用规则
  • 三.rewrite 实例
    • 1.基于域名的跳转
    • 2.基于客户端 IP 访问跳转
    • 3.基于旧域名跳转到新域名后面加目录
    • 4.基于参数匹配的跳转
    • 5.基于目录下所有 php 结尾的文件跳转
    • 6.基于最普通一条 url 请求的跳转
  • 四、总结
    • 1.遇到的问题
    • 2.本章总结

一.Nginx Rewrite概述

1.Rewrite跳转场景

rewrite功能: 使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记位实现URL重写以及重定向。
比如: 更换域名后需要保持旧的域名能跳转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。

rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用, 例如http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

2.Rewrite跳转场景

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

  • URL: 就是一个具体路径/位置
  • URI: 指的是一个拥有相同类型/特性的对象集合
  • URN:用名称定位

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

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

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

3.Rewrite跳转实现

在这里插入图片描述

4.Rewrite实际场景

4.1Nginx跳转需求的实现方式

(1)使用rewrite进行匹配跳转(例如防盗链)

(2)使用if匹配全局变量后跳转(此匹配全局变量是nginx服务本身全局变量)

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

4.2 rewrite放在 server{},if{},location{} 段中

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

4.3对域名或参数字符串

(1)使用if全局变量匹配
(2)使用proxy_pass反向代理

5.nginx正则表达式

5.1 常用的正则表达式元字符

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

6.Rewrite 命令

6.1 Rewrite 命令语法

rewrite [fiag];

regex:正则

replacement:跳转后的内容

fiag:rewrite支持的flag标记(进行判断)

6.2flag标记说明

标记说明特点
last相当于apache的[L]标记,表示完成rewrite在本条规则完成后,继续向下匹配新的location URL规则,一般或者用在server和if当中
break本条规则匹配完成即终止,不在匹配后面的任何规则break在location下面用的多,与last类似,但是不会重新发起一次处理过程,而是直接放回处理结果
redirect返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url该标记表示当前规则匹配成功后会立即进行重定向操作
permanent返回301永久重定向,浏览器地址栏会显示跳转后的URL地址,爬虫更新url该标记和redirect类似,他是永久重定向

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

6.3last和break比较

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

总:从功能看,rewrite和location似乎有点像,都能实现跳转,主要区别在于rewrite是在同一域名内更改获取资源的路径,而location是对一类路径做控制访问或反向代理,还可以proxy_pass到其他机器。
rewrite 对访问的域名或者域名内的URL路径地址重写
location对访问的路径做访问控制或者代理转发

二.location

1.location分类

1.1精确匹配

location = patt {}

1.2一般匹配

location patt {}

1.3正则匹配

location ~ patt {}

2.正则匹配的常用的表达式

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

3.location优先级

(1)首先精确匹配:=

(2)其次前缀匹配:^~

(3)其次是按文件中顺序的正则匹配:*

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

(5)最后是交给/通用匹配

总结:
(1)优先级总结:(location=完整路径)>(location ^~ 路径)>(location~,~*正则顺序)>(location不分起始路径)>(location /)
(2)location匹配:
首先看优先级:精确(=)>前缀(^~)>正则(~,~*)>一般>通用(/)
优先级相同:正则看上下顺序,上面的优先,一般匹配看长度,最长匹配的优先
精确,前缀,正则,一般都没有匹配到,最后再看通用匹配,一般匹配

4.location示例

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

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

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

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

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

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

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

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

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

5.实际网站使用中,至少有三个匹配规则定义

5.1第一个必选规则

直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。

可以是一个静态首页,也可以直接转发给后端应用服务器

location = / {

​ root html;

​ index index.html index.htm;

}

5.2第二个必选规则

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

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

5.3第三个规则就是通用规则

比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器

非静态文件请求就默认是动态请求

location / {

​ proxy_pass http://tomcat_server;

}

三.rewrite 实例

1.基于域名的跳转

现在公司旧域名www.kgc.com有业务需求变更,需要使用新域名www.benet.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。

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;		#日志修改
	location / {
	#添加域名重定向
        if ($host = 'www.kgc.com'){						#$host为rewrite全局变量,代表请求主机头字段或主机名
			rewrite ^/(.*)$ http://www.benet.com/$1 permanent;	#$1为正则匹配的内容,即“域名/”之后的字符串
        }
        root   html;
        index  index.html index.htm;
    }
}
echo "192.168.245.111 www.kgc.com www.benet.com" >> /etc/hosts
systemctl restart nginx

浏览器输入模拟访问 http://www.kgc.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.benet.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。
在这里插入图片描述

2.基于客户端 IP 访问跳转

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

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;		#日志修改
#设置是否合法的IP标记
set $rewrite true;							#设置变量$rewrite,变量值为boole值true
#判断是否为合法IP
if ($remote_addr = "192.168.245.111"){		#当客户端IP为192.168.245.111时,将变量值设为false,不进行重写
    set $rewrite false;
}
#除了合法IP,其它都是非法IP,进行重写跳转维护页面
if ($rewrite = true){						#当变量值为true时,进行重写
    rewrite (.+) /weihu.html;				#将域名后边的路径重写成/weihu.html,例如www.kgc.com/weihu.html
}
location = /weihu.html {
    root /var/www/html;						#网页返回/var/www/html/weihu.html的内容
}

location / {
    root   html;
    index  index.html index.htm;
  }
}
mkdir -p /var/www/html/
echo '<h1>We are maintaining now!</h1>' > /var/www/html/weihu.html
systemctl restart nginx

只有 IP 为 192.168.245.111 能正常访问,其它地址都是维护页面
本机访问如下图:
在这里插入图片描述
另一台虚拟机访问:
在这里插入图片描述

3.基于旧域名跳转到新域名后面加目录

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

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

使用浏览器访问 http://bbs.kgc.com/post/1.html 跳转到 http://www.kgc.com/bbs/post/1.html
在这里插入图片描述

4.基于参数匹配的跳转

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

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.kgc.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/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;
  }
}
systemctl restart nginx

使用浏览器访问 http://www.kgc.com/100-200-100.html 或 http://www.kgc.com/100-100-100.html 跳转到http://www.kgc.com页面。
在这里插入图片描述

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

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

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;
location ~* /upload/.*\.php$ {
    rewrite (.+) http://www.kgc.com permanent;
}

location / {
    root   html;
    index  index.html index.htm;
  }
}
systemctl restart nginx

浏览器访问 http://www.kgc.com/upload/123.php 跳转到http://www.kgc.com页面。
在这里插入图片描述

6.基于最普通一条 url 请求的跳转

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

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;
location ~* ^/abc/123.html {
    rewrite (.+) http://www.kgc.com permanent;
}
location / {
    root   html;
    index  index.html index.htm;
  }
}
systemctl restart nginx

浏览器访问 http://www.kgc.com/abc/123.html 跳转到http://www.kgc.com页面。
在这里插入图片描述

四、总结

1.遇到的问题

①配置文件出错----------》利用好nginx -t 进行排错

②nginx未添加服务 导致服务无法启动

③有时候echo进行传参时 双引号无法识别 ,可以试着换成单引号

④记得要关闭安全机制和防火墙

2.本章总结

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

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

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

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

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

相关文章

Jmeter(jmeter-plugins插件的安装使用)

目录 一、安装JMter Plugins 二、Custom Thread Groups插件 Stepping Thread Group 元件 Ultimate Thread Group 一、安装JMter Plugins 1、官网下载 JMeter Plugins 的jar包 2. 将下载的jar包复制到 %JMETER_HOME%\lib\ext 目录下 3. 启动 JMeter --> Options -->…

学习系统编程No.26【信号处理实战】

引言&#xff1a; 北京时间&#xff1a;2023/6/26/13:35&#xff0c;昨天12点左右睡觉&#xff0c;本以为能和在学校一样&#xff0c;7点左右起床&#xff0c;设置了7点到8点30时间段内的4个闹钟&#xff0c;可惜没想到啊&#xff0c;没醒&#xff0c;直接睡到了12点&#xff…

rust基本语法

文章目录 变量与可变性变量与常量Shadowing&#xff08;隐藏&#xff09;数据类型标量类型1.整数类型2.浮点类型3.布尔类型4.字符类型 复合类型1.Tuple2.数组 函数if表达式循环1.loop2.while3.for 变量与可变性 声明变量使用let关键字&#xff0c;默认情况下&#xff0c;变量是…

kafka初学入门

kafka概述 消息中间件对比 特性ActiveMQRabbitMQRocketMQKafka开发语言javaerlangjavascala单机吞吐量万级万级10万级100万级时效性msusmsms级以内可用性高&#xff08;主从&#xff09;高&#xff08;主从&#xff09;非常高&#xff08;分布式&#xff09;非常高&#xff0…

大模型显存占用分析

大模型显存占用由以下几部分组成&#xff1a; 1. 模型本身参数&#xff0c;假设是1个单位 2.模型的梯度&#xff0c;同样也是一个单位 3.优化器参数&#xff08;占大头&#xff09;&#xff1a;以Adam参数为例&#xff0c;还需要在显卡中额外存储m和v两个参数&#xff0c;因…

File学习

1.构造方法 1.File(String pathname) 根据路径名创建抽象File对象 //1. 通过路径进行创建 pathname是字符串格式的路径名public File(String pathname) {if (pathname null) {throw new NullPointerException();}// 和系统交互 获取最近的File文件目录文件this.path fs.nor…

10分钟快速入门UI自动化-Puppeteer

目录 先简单介绍一下&#xff1a; 工欲善其事必先利其器&#xff0c;首先把所需要的工具装好 1. 安装node 2. 安装npm &#xff08;node安装时会自动安装npm,如果已安装node&#xff0c;此步请忽略) 3. 安装cnpm (npm下载包失败&#xff0c;选择cnpm安装) 4. 新建一个nod…

【ICer必备 4】IC封装设计流程

【ICer必备 3】模拟IC设计全流程 ------------------------------------------------文末附往期文章链接--------------------------------------前言一、IC封装设计过程二、常见IC封装类型三、常见封装特点四、封装设计常用软件五、EM仿真常用EDA&#xff08;1&#xff09;HFS…

apt命令概述,apt命令在Ubuntu16.04安装openjdk-7-jdk

apt是一条linux命令&#xff0c;适用于deb包管理式操作系统&#xff0c;主要用于自动从互联网的软件仓库中搜索、安装、升级、卸载软件或操作系统。deb包是Debian 软件包格式的文件扩展名。 翻译过来就是&#xff1a; apt是一个命令行包管理器&#xff0c;为 搜索和管理以及查询…

解决MySQL删除数据后自增主键ID不连贯问题

首先我们需要取消id的自增和主键 下列代码以water表中的id列为例 alter table watermodify id int not null;alter table waterdrop primary key;然后重新生成id列 set i0; update water set water.id(i:i1);下一步就是重新设置为主键自增 alter table wateradd primary key…

【JSP技术】web杂谈(2)之JSP是什么?

涉及知识点 什么是JSP&#xff0c;JSP的特点&#xff0c;JSP的未来趋势&#xff0c;JSP的应用范例。深入了解JSP技术。 原创于&#xff1a;CSDN博主-《拄杖盲学轻声码》&#xff0c;更多内容可去其主页关注下哈&#xff0c;不胜感激 文章目录 涉及知识点前言1.什么是JSP2&…

Webpack和Vite简单使用

目录 WebPack 介绍 基础使用 初始化使用 webpack.config.js文件 webpack开发服务器 vite 介绍 使用 使用vite创建vue框架项目 WebPack 介绍 当我们习惯了在node中编写代码的方式后&#xff0c;在回到前端编写html、css、js这些东西会感觉到各种的不便。比如: 不能放心…

九、ElasticSearch 运维 -集群维度

1. 查看集群健康 用于简单的判断集群的健康状态&#xff0c;集群内的分片的分配迁移情况。 GET _cluster/health-------------------------Respond----------------------------- {"cluster_name" : "test-jie","status" : "green",…

使用数组的方式计算---任意给出一个年,月,日,判断出这是一年的第几天

任意给出一个年&#xff0c;月&#xff0c;日&#xff0c;判断出这是一年的第几天&#xff1b; 闰年算法&#xff1a;能被4整除且不能被100整除&#xff0c;或者能被400整除 如2015年 5 10 是这一年的第131天 使用数组的方式计算&#xff0c;将每个月的天数放在一个数…

蜂网互联 企业级路由器v4.31 密码泄露漏洞

漏洞描述 蜂网互联企业级路由器v4.31存在接口未授权访问&#xff0c;导致攻击者可以是通过此漏洞得到路由器账号密码接管路由器 漏洞影响 蜂网互联企业级路由器v4.31 网络测绘 app“蜂网互联-互联企业级路由器” 漏洞复现 payload http://ip:port/action/usermanager.ht…

c++ 杂食记

1. inline关键字 在C中&#xff0c;inline关键字用于指定函数应该被内联。 当一个函数被内联时&#xff0c;它的代码将直接插入到调用该函数的代码中&#xff0c;而不是作为单独的函数调用 这可以提高程序的性能&#xff0c;因为它减少了函数调用的开销&#xff0c;并提高了数…

计算机网络那些事之 MTU 篇

哈喽大家好&#xff0c;我是咸鱼 今天我们来聊聊计算机网络中的 MTU &#xff08;Maximum Transmission Unit&#xff09; 什么是 MTU ? MTU&#xff08;Maximum Transmission Unit&#xff09;是指数据链路层中的最大传输单元 通俗点来讲&#xff0c;MTU 是指数据链路层能…

基于workerman 即时通讯聊天(uniapp + pc)

laychat workerman 实现 webIM即时通讯系统 下载 laychat-master.zip https://github.com/hszyh/laychat 实现了功能: 1、通过snake后台实现对聊天成员的增删改查&#xff0c;动态推送给在线的用户 2、实现了群组的查找 3、实现了创建我的群组,删除我的群组,添加群组成员…

性能测试工具——LoadRunner内部介绍以及常见问题

目录 Tools Recording Options General Options 注释脚本 Review log Runtime-Settings General Network Browser Internet Protocol HTTPS证书 总结&#xff1a; Tools Recording Options 接下来我们挨个看一下里面的东东以及区别 General&#xff08;通常的&am…

【Python编程】将格式为ppm和pgm的图片批量转换为png或jpg格式的图片

前序 如果文件夹中有异常图片&#xff0c;则可以使用以下代码从而跳过这些异常图片而不影响转换代码的运行。例如本人在解压时中断而导致的图片异常问题&#xff0c;图片示例如下&#xff1a; from PIL import ImageFile ImageFile.LOAD_TRUNCATED_IMAGES True正文 导入用…