Linux4.8Nginx Rewrite

news2024/12/24 21:55:18

文章目录

  • 计算机系统
    • 5G云计算
      • 第六章 LINUX Nginx Rewrite
        • 一、Nginx Rewrite 概述
          • 1.常用的Nginx 正则表达式
          • 2.rewrite和location
          • 3.location
          • 4.实际网站使用中,至少有三个匹配规则定义
          • 5.rewrite
          • 6.rewrite 示例

计算机系统

5G云计算

第六章 LINUX Nginx Rewrite

一、Nginx Rewrite 概述

1.常用的Nginx 正则表达式
正则表达式符号说明
^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”
但不能匹配“o”
?匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”
”?”等效于”{0,1}”
.匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符
请使用诸如“[.\n]”之类的模式
\将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“$”则匹配“$”
\d匹配纯数字[0-9]
\s空白符
\w任意单词字符包括下划线[A-Za-z0-9_]
{n}重复 n 次
{n,}重复 n 次或更多次
{n,m}重复 n 到 m 次
[]定义匹配的字符范围
[c] :匹配单个字符 c
[a-z]匹配 a-z 小写字母的任意一个
[a-zA-Z0-9]匹配所有大小写字母或数字
()表达式的开始和结束位置
|或运算符
2.rewrite和location

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

rewritelocation
对访问的域名或者域名内的URL路径地址重写对访问的路径做访问控制或者代理转发
3.location
location种类说明
精准匹配location = / {…}
一般匹配location / {…}
正则匹配location ~ / {…}
location 常用的匹配规则说明
=进行普通字符精确匹配,也就是完全匹配
^~表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 正则匹配location
~区分大小写的匹配
~*不区分大小写的匹配
!~区分大小写的匹配取非
!~*不区分大小写的匹配取非
location 优先级
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 *
然后匹配不带任何修饰符的一般前缀匹配
最后是交给 / 通用匹配

优先级总结
(location = 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分前缀路径) > (location /)

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

在没有精准匹配的情况下,先看前缀匹配的长度,然后根据最长的前缀匹配的优先级去确定是否再去看其它正则匹配location,如果最长的前缀匹配带有 ^~不再看其它正则匹配location,如果最长的前缀匹配是没有修饰符的一般匹配则会再看其它正则匹配location

前缀匹配看长度,最长的优先匹配
正则匹配看上下顺序,由上往下依次匹配,当有匹配成功时候,停止匹配,按当前匹配规则处理请求

只有在精准、前缀、正则、一般 都没有匹配到的时候才会看通用匹配

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

1)第一个必选规则

直接匹配网站根目录首页,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网。可以是一个静态首页,也可以直接转发给后端应用服务器

location = /index.html {
    root   html;
	index  index.html index.htm;
}

2)第二个必选规则

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

location ^~ /static/ {
    root /webroot/;
}

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

3)第三个必选规则

通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求

location / {
    proxy_pass http://tomcat_server;
}
5.rewrite

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

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

1)rewrite跳转实现

Nginx

通过ngx_http_rewrite_module模块支持URL重写、支持if条件判断,但不支持else

跳转

从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误

PCRE支持

perl兼容正则表达式的语法规则匹配

重写模块 set 指令

创建新的变量并设其值

2)rewrite 执行顺序

rewrite 执行顺序
执行 server 块里面的 rewrite 指令
执行 location 匹配
执行选定的 location 中的 rewrite 指令

3)语法格式

rewrite <regex> <replacement> [flag]

regex :表示正则匹配规则
replacement :表示跳转后的内容
flag :表示 rewrite 支持的 flag 标记

###flag标记说明###
last :本条规则匹配完成后,不终止重写后的url匹配,一般用在 server 和 if 中
break :本条规则匹配完成即终止,终止重写后的url匹配,一般使用在location中
redirect :返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent :返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
6.rewrite 示例

1)基于域名的跳转

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

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.kb.com;		
	###域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kb.com-access.log;		
	###日志修改
	location / {
	#添加域名重定向
        if ($host = 'www.kb.com'){						
        ###$host为rewrite全局变量,代表请求主机头字段或主机名
			rewrite ^/(.*)$ http://www.benet.com/$1 permanent;	         ###$1为正则匹配的内容,即“域名/”之后的字符串
        }
        root   html;
        index  index.html index.htm;
    }
}


echo "192.168.58.60 www.kb.com www.benet.com" >> /etc/hosts
systemctl restart nginx
浏览器输入模拟访问 http://www.kb.com/test/1.html(虽然这个请求内容是不存在的)
会跳转到www.benet.com/test/1.html,查看元素可以看到返回301,实现了永久重定向跳转,而且域名后的参数也正常跳转。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.kb.com;		
	###域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kb.com-access.log;		
	###日志修改

	###设置是否合法的IP标记
    set $rewrite true;							
    ###设置变量$rewrite,变量值为boole值true
    ###判断是否为合法IP
	if ($remote_addr = "192.168.58.60"){		
	###当客户端IP为192.168.58.60时,将变量值设为false,不进行重写
        set $rewrite false;
    }
	###除了合法IP,其它都是非法IP,进行重写跳转维护页面
    if ($rewrite = true){						
    ###当变量值为true时,进行重写
        rewrite (.+) /weihu.html;				
        ###将域名后边的路径重写成/weihu.html后转发,例如
        www.kb.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.58.60 能正常访问,其它地址都是维护页面

--------------------------------------------------------
如果rewrite (.+) /weihu.html; 换成rewrite (.+) /weihu.html permanent; 的话,若不是 192.168.58.60 的主机访问会使浏览器修改请求访问的 URL 成 http://www.kb.com/weihu.html 再请求访问,这样就会进入一直在 rewrite 的死循环,访问请求会一直被重写成 http://www.kb.com/weihu.html 再请求访问

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  bbs.kb.com www.kb.com;		
	###域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kb.com-access.log;
	###添加
	location /post {
        rewrite (.+) http://www.kb.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.58.60 bbs.kb.com"  >> /etc/hosts
systemctl restart nginx
使用浏览器访问 http://bbs.kb.com/post/1.html 跳转到 http://www.kb.com/bbs/post/1.html

在这里插入图片描述
在这里插入图片描述

4)基于参数匹配的跳转

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

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.kb.com;		
	###域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.kb.com-access.log;
	
	if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.+) http://www.kb.com permanent;
    }

	location / {
        root   html;
        index  index.html index.htm;
    }
}

-------------------------------------------------
$request_uri:包含请求参数的原始URI,不包含主机名,如:http://www.kb.com/abc/bbs/index.html?a=1&b=2 中的 /abc/bbs/index.php?a=1&b=2
$uri:这个变量指当前的请求URI,不包括任何参数,如:/abc/bbs/index.html
$document_uri:与$uri相同,这个变量指当前的请求URI,不包括任何传递参数,如:/abc/bbs/index.html
-------------------------------------------------

systemctl restart nginx
使用浏览器访问 http://www.kb.com/100-200-100.html 或 http://www.kb.com/100-100-100.html 跳转到http://www.kb.com页面
s/index.php?a=1&b=2
$uri:这个变量指当前的请求URI,不包括任何参数,如:/abc/bbs/index.html
$document_uri:与$uri相同,这个变量指当前的请求URI,不包括任何传递参数,如:/abc/bbs/index.html
-------------------------------------------------

systemctl restart nginx
使用浏览器访问 http://www.kb.com/100-200-100.html 或 http://www.kb.com/100-100-100.html 跳转到http://www.kb.com页面

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

看完一位毕业的拼多多“P9”级别员工以及他的四页半简历,我悟了

前几天在脉脉上看到一个热帖&#xff0c;是刚从PDD毕业的P9级别员工吴可发的&#xff0c;同时附上了他的简历&#xff0c;这个简历很有意思&#xff0c;基本上和国内互联网这十多年来的发展步骤重叠&#xff0c;能够反映出&#xff0c;在这样一个跌宕起伏的时代里&#xff0c;个…

一次有关 DNS 解析导致 APP 慢的问题探究

一、业务背景 HTTTPDNS AWS Router53 APP 使用 HTTPDNS&#xff0c; 为解决 DNS 解析生效慢&#xff0c; DNS 劫持等问题。 我们 IOS 和安卓都是使用了 HTTPDNS。 域名托管在 AWS Router53。 域名有多个解析(基于延迟)&#xff0c;为了解决就近接入。 示例配置 ai.baidu.c…

网易Java后端面经(一面)

这是网易的Java一面&#xff0c;问的都很基础。 1.session过期怎么处理&#xff1f; session过期通常指用户在一段时间内没有进行任何操作而导致session失效。针对这种情况&#xff0c;可以采取以下措施&#xff1a; 1. 前端提示用户session即将过期&#xff0c;提醒其重新登录…

JavaScript对象的增强知识

Object.defineProperty ◼ 在前面我们的属性都是直接定义在对象内部&#xff0c;或者直接添加到对象内部的&#xff1a;  但是这样来做的时候我们就不能对这个属性进行一些限制&#xff1a;比如这个属性是否是可以通过delete删除的&#xff1f;这个属性是否在for-in遍历的时候…

微信能取代对讲机吗?区别在哪?

对讲机和微信的区别在哪&#xff1f;为什么大家在通讯方面选择对讲机而不是微信&#xff1f; 微信作为社交软件在多个领域都有着广泛的应用&#xff0c;不过在对讲机行业也在讨论一个话题&#xff1a;微信能否取代对讲机&#xff1f;下面河南宝蓝小编就和大家聊聊这个话题。 …

基于redis实现秒杀并防止超卖

基于redis实现秒杀并防止超卖 为什么基于redis针对秒杀商品库存为一个的情况setnx代码实现测试 针对有多个库存的商品实现测试 为什么基于redis 因为所有redis的操作&#xff08;这里指的是key的操作&#xff0c;像备份落盘之类的另算&#xff09;都是单线程的&#xff0c;所以…

一文读懂:LoRA实现大模型LLM微调

LoRA大模型LLM微调 为什么要进行微调&#xff1f;LoRA思路提高权重更新效率选择低的秩 实现LoRALoRA在LLaMA实现 为什么要进行微调&#xff1f; 在快速发展的人工智能领域中&#xff0c;以高效和有效的方式使用大型语言模型变得越来越重要。 预训练的大型语言模型通常被称为优…

02-启动 Vue 项目

一. 学习目标 掌握 Vue 项目的启动 二. 学习内容 掌握 Vue 项目的启动 三. 学习过程 项目的启动也有两种方式&#xff0c;一种是通过图形界面启动&#xff0c;另一种是通过命令行启动。 1.图形界面 打开vscode编辑器&#xff0c;点击 1.文件 ——>打开文件夹&#xff0c…

springboot实现支付宝支付(沙箱环境)

springboot实现支付宝支付 1. 获取应用id,应用私钥和支付宝公钥2. 开始开发3. 内网穿透4. 测试支付功能 1. 获取应用id,应用私钥和支付宝公钥 进入支付宝控制台:https://open.alipay.com/develop/manage 找到沙箱 这里可以看到应用id 可以看到应用私钥和支付宝公钥,获取这…

Zoho:集成ChatGPT、开发大型语言模型,加紧布局AI+SaaS

在企业的数字化转型进程中&#xff0c;管理层和员工的数字化意识会随着建设的推进而不断提高&#xff0c;对于办公场景的数字化应用需求也不断产生。传统的办公系统建设中&#xff0c;系统的应用能力需要支撑越来越丰富的场景需求。 《今日人工智能》采访到Zoho中国VP兼SaaS事业…

【编程语言 · C语言 · for语句】

for 语句 C语言中&#xff0c;使用for语句也可以控制一个循环&#xff0c;并且在每一次循环时修改循环变量。在循环语句中&#xff0c;for语句的应用最为灵活&#xff0c;不仅可以用循环次数已经确定的情况&#xff0c;而且可以用于循环次数不确定而只给出循环结束条件的情况。…

jenkins构建pipline无法执行shell命令原因

问题表现 新的服务器上&#xff0c;新安装的jenkins&#xff0c;在上面创建了一个pipline项目&#xff0c;脚本里有shell命令&#xff0c;但是jenkins每次执行都卡住&#xff0c;经过尝试&#xff0c;无论多简单的命令都执行不了&#xff0c;cp&#xff0c;mv等都不行&#xf…

华为路由器:ospf协议三张表及邻居建立过程

说明&#xff1a;本篇接上一篇继续讲解 拓扑图 为了方便&#xff0c;我把R1/2/3/4/5的router id改成了回环网卡的IP。 ospf协议三张表 邻居表&#xff08;neighbortable&#xff09; OSPF用邻居机制来发现和维持路由的存在&#xff0c;邻居表存储了双向通信的邻居关系OSPF路…

矩形图:数据之美在图形中展现

在当今信息爆炸的时代&#xff0c;数据已经成为决策和洞察的重要基石&#xff0c;但海量的数据如果不经过整理和呈现&#xff0c;往往难以得出有意义的结论。这时候&#xff0c;可视化工具的作用就变得尤为重要了。在众多可视化形式中&#xff0c;矩形图以其简洁直观的特点受到…

团队管理之性能实施团队日志9

最近项目进入胶着状态。 混合场景在有些项目组里已经可以开始了&#xff0c;但还是有两三个项目组现在是完全没办法混合起来的。 本周计划是把基准测试、容量测试跑完&#xff0c;稳定性测试每个项目组至少能跑一遍。 但是从进度上来看&#xff0c;容量测试至少有四个系统不能跑…

各类动态路由协议汇总简介

目录 一、前言 二、OSPF协议 &#xff08;一&#xff09;OSPF是什么 &#xff08;二&#xff09;OSPF的工作原理 &#xff08;三&#xff09;OSPF的特点 &#xff08;四&#xff09;OSPF的使用 &#xff08;五&#xff09;OSPF的优点 &#xff08;六&#xff09;总结 …

ROS——从深度图转换到octomap(C++)

文章目录 介绍环境准备三维灰度栅格图三维RGB栅格图对点云进行过滤处理参考介绍 八叉树是用于在3D视觉中细分空间的数据结构。每个立方体都可以逐级地细分为8个子立方体,直到达到了给定的最小体积(体素)尺寸。且该最小体积(体素)决定了八叉树的分辨率。 octomap的作用:…

代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期|714.买卖股票的最佳时机含手续费

LeetCode309.最佳买卖股票时机含冷冻期 动态规划五部曲&#xff1a; 1&#xff0c;确定dp数组以及下标的含义&#xff1a;dp[i][j]&#xff0c;第i天状态为j&#xff0c;所剩的最多现金为dp[i][j]。出现冷冻期之后&#xff0c;状态其实是比较复杂度&#xff0c;例如今天买入股…

接口自动化【七】__包装响应结果的数据为key-value

文章目录 前言 一、本章学习的思路 二、用接口新建商品_使用步骤 ​​​​​​​步骤一&#xff1a;先用抓包的方式拿到新建商品的接口 步骤二&#xff1a;我们先用单接口的形式&#xff0c;把这个商品添加成功 三、处理响应接口_&#xff08;包装响应结果的数据为&#xf…