nginx之rewrite

news2024/9/20 18:33:56

  • 一、Rewrite跳转的场景
  • 二、Rewrite跳转实现
  • 三、Rewrite实际场景
  • 四、常用的 Nginx 正则表达式
  • 五、Rewrite命令、语法格式
  • 六、location的分类
  • 七、location的优先级
  • 八、rewrite与location的区别
  • 九、rewrite示例
    • 9.1 基于域名的跳转
    • 9.2 基于客户端 IP 访问跳转
    • 9.3 基于旧域名跳转到新域名后面加目录
    • 9.4 基于参数匹配的跳转
    • 9.5 基于目录下所有 php 结尾的文件跳转
    • 9.6 基于最普通一条 url 请求的跳转

一、Rewrite跳转的场景

  • 可以调整用户浏览的URL,看起来更规范、合理
  • 企业会将动态URL地址伪装成静态地址提供服务
  • 网址换新域名后,让旧的访问跳转到新的域名上。例如,访问京东的 360buy.com会跳转到 jd.com
  • 服务端某些业务调整

补充:

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

二、Rewrite跳转实现

  1. Nginx: 通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else。
  2. 跳转: 从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误。
  3. PCRE支持: perl兼容正则表达式的语法规则匹配。另外该模块需要 PCRE 支持,应在编译 Nginx 时指定 PCRE 支持,默认已经安装。
  4. 重写模块 set 指令: 创建新的变量并设其值。

rewrite使用nginx全局变量或自己设置的变量,结合正则表达式和标志位实现URL重写以及重定向

三、Rewrite实际场景

Nginx跳转需求的实现方式

  • 使用rewrite进行匹配跳转(防盗链)
  • 使用if匹配全局变量后跳转(匹配的全局变量是Nginx本身的全局变量)
  • 使用location匹配再跳转(匹配的访问URL路径,location可以匹配本地的重写以及跨服务器的跳转)

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

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

对域名或参数字符串

  • 使用if全局变量匹配
  • 使用proxy_pass反向代理

四、常用的 Nginx 正则表达式

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

五、Rewrite命令、语法格式

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

flag标记说明

标记说明
last相当于Apache的[L]标记,表示完成rewrite;在本条规则完成后,继续向下匹配新的location URL规则,一般用于server和if中
break本条规则匹配完成即终止,不再匹配后面的任何规则。一般使用在 location 中
redirect返回302临时重定向,浏览器地址会显示跳转后的URL地址,爬虫不会更新url
permanent返回301永久重定向,浏览器地址栏会显示跳转后的URL地址爬虫更新url
set表示当前规则匹配成功设置一个变量,并把变量传入下一跳规则

flag总结

last会重新匹配URL地址,break则没有

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

redirect表示当前规则匹配成功后立即进行重定向操作

permanent与redirect类似,但是永久重定向

六、location的分类

location 大致可以分为三类:

精准匹配:location = / {...}
一般匹配:location / {...} 
正则匹配:location ~ / {...}

location 常用的匹配规则:

符号含义
~区分大小写的匹配
~*不区分大小写的匹配
!~区分大小写的匹配取非
!~*不区分大小写的匹配取非
=进行普通字符精确匹配,也就是完全匹配
^~表示普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其它 location

七、location的优先级

location 优先级:

  1. 首先精确匹配 =
  2. 其次前缀匹配 ^~
  3. 其次是按文件中顺序的正则匹配 *
  4. 然后匹配不带任何修饰的前缀匹配
  5. 最后是交给 / 通用匹配

location示例

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

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

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

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

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

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

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

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

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

总结:

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

location 匹配

首先看 优先级:精确>前缀>正则>一般>通用

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

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

八、rewrite与location的区别

相同点

  • 都能实现跳转

不同点

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

rewrite会写在location里,执行顺序

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

总结

  • rewrite改写访问的URL 路径(被访问的 HTML/HTM/CSS文件)
  • location 对一类地址进行权限控制 (认证控制) + 跳转 (跨服务器进行URL跳转)

rewrite 会写在 location 的执行顺序

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

rewrite 在 server{} location{} if{}的执行顺序

server ----> location ----> location if

九、rewrite示例

9.1 基于域名的跳转

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

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


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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

9.2 基于客户端 IP 访问跳转

今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP :192.168.147.100访问正常。
vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.zhangsan.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.zhangsan.com-access.log;		#日志修改

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

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

现在访问的是 http://bbs.zhangsan.com/post/,现在需要将这个域名下面的访问都跳转到http://www.zhangsan.com/bbs/post/
vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  bbs.zhangsan.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.zhangsan.com-access.log;
	#添加
	location /post {
        rewrite (.+) http://www.zhangsan.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.147.100 bbs.zhangsan.com"  >> /etc/hosts
systemctl restart nginx
使用浏览器访问 http://bbs.zhangsan.com/post/1.html 跳转到 http://www.zhangsan.com/bbs/post/1.html

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

9.4 基于参数匹配的跳转

现在访问http://www.zhangsan.com/100-(100|200)-100.html 跳转到http://www.zhangsan.com页面。
vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.zhangsan.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.zhangsan.com-access.log;
	
	if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {
        rewrite (.+) http://www.zhangsan.com permanent;
    }
	
	location / {
        root   html;
        index  index.html index.htm;
    }
}

-------------------------------------------------
$request_uri:包含请求参数的原始URI,不包含主机名,如:http://www.zhangsan.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.zhangsan.com/100-200-100.html 或 http://www.zhangsan.com/100-100-100.html 跳转到http://www.zhangsan.com页面。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

要求访问 http://www.zhangsan.com/upload/123.php 跳转到首页。
vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.zhangsan.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.zhangsan.com-access.log;
	
	location ~* /upload/.*\.php$ {
        rewrite (.+) http://www.zhangsan.com permanent;
    }
    
	location / {
        root   html;
        index  index.html index.htm;
    }
}


systemctl restart nginx
浏览器访问 http://www.zhangsan.com/upload/123.php 跳转到http://www.zhangsan.com页面。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

要求访问一个具体的页面如 http://www.zhangsan.com/abc/123.html 跳转到首页
vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.zhangsan.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.zhangsan.com-access.log;
	
    location ~* ^/abc/123.html {
        rewrite (.+) http://www.zhangsan.com permanent;
    }


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


systemctl restart nginx
浏览器访问 http://www.zhangsan.com/abc/123.html 跳转到http://www.zhangsan.com页面。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

chatgpt赋能python:Python迭代运算:概述、应用及效果分析

Python迭代运算&#xff1a;概述、应用及效果分析 在Python编程领域中&#xff0c;迭代运算是一项基础性操作。它不仅适用于循环遍历数据&#xff0c;还支持函数式编程中的高阶函数应用&#xff08;例如map、filter等&#xff09;。本文将从多个方面探讨Python迭代运算的应用和…

高性能计算开发软件培训班-选猿代码科技IT培训机构!

学习CPU并行程序性能优化的意义&#xff1a; 学习CPU计算是现代计算机科学中不可或缺的一部分。掌握CPU计算原理和应用&#xff0c;能够提高我们的编程技能和解决问题的能力&#xff0c;帮助我们更好地应对计算机科学领域中的挑战和机遇。此外&#xff0c;CPU计算在计算机体系结…

python写路径时候的问题————转载ningqingzy的文章

作为笔记总结学习&#xff0c;如有侵权&#xff0c;立马删除。 总结有三种方法&#xff1a; 更换为绝对路径的写法&#xff1a;func1(“C:\Users\renyc”)显式声明字符串不用转义&#xff08;加r&#xff09;&#xff1a;func1(r"C:\Users\renyc")使用Linux的路径&a…

workbench 链接mysql 报错 authentication plugin caching_sha2_password

用workbench连接MySQL出现Authentication plugin ‘caching_sha2_password’ cannot be loaded的问题&#xff0c;如下图 原因 出现这个问题的原因是由于Navicat和MySQL的版本问题&#xff0c; mysql8 之前&#xff0c;加密规则是mysql_native_password&#xff1b; mysql8 之后…

leetcode97. 交错字符串(动态规划-java)

交错字符串 leetcode97. 交错字符串题目描述解题思路代码演示&#xff1a; 动态规划加状态压缩代码演示 动态规划专题 leetcode97. 交错字符串 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/interleaving-string 题目描…

线性代数高级--矩阵的秩--SVD分解定义--SVD分解的应用

目录 矩阵的秩 概念 k阶子式 矩阵的秩的定义 矩阵的秩的性质 SVD分解 概念 注意 SVD的分解过程 SVD分解的应用 矩阵的秩 概念 矩阵的秩是线性代数中的一个重要概念&#xff0c;用于描述矩阵的行&#xff08;或列&#xff09;向量的线性无关程度。矩阵的秩可以通过…

chatgpt赋能python:Python遍历0到100的使用场景及方法

Python遍历0到100的使用场景及方法 Python是一种简洁、高效的脚本语言&#xff0c;广泛用于各种领域的开发。本文介绍Python遍历0到100的使用场景以及方法&#xff0c;旨在帮助读者更加了解Python的强大之处。 遍历0到100的背景和意义 遍历0到100是一种常见的问题&#xff0…

网络安全合规-银行业数据治理架构体系搭建(一)

为引导银行业金融机构加强数据治理&#xff0c;充分发挥数据价值&#xff0c;全面向高质量发展转变&#xff0c;银监会于2018年发布了《银行业金融机构数据治理指引》&#xff0c;主要内容如下&#xff1a; 近年来银行业金融机构在业务快速发展过程中&#xff0c;积累了客户数…

JavaScript 手写代码 第六期(重写数组方法三) 用于遍历的方法

文章目录 1. 为什么要手写代码&#xff1f;2. 手写代码2.1 forEach2.1.1 基本使用2.1.2 手写实现 2.2 map2.2.1 基本使用2.2.2 手写实现 2.3 filter2.3.1 基本使用2.3.2 手写实现 2.4 every2.4.1 基本使用2.4.2 手写实现 2.5 some2.5.1 基本使用2.5.2 手写实现 2.6 reduce2.6.1…

虚幻引擎(UE5)-大世界分区WorldPartition教程(二)

文章目录 前言一、OFPA怎么用二、OFPA怎么用总结 上一篇&#xff1a;虚幻引擎(UE5)-大世界分区WorldPartition教程(一) 前言 在UE4版本中中&#xff0c;Actor是保存在关卡文件中的&#xff0c;也就是说&#xff0c;如果要编辑关卡中的某些Actor&#xff0c;需要签出关卡文件进…

STM32单片机(七)ADC模拟数字转换器----第二节:ADC模数转换器练习2(AD多通道)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

SNMP 计算机网络管理 实验2(二) SNMP服务与常用网管命令之任务三:对同学的计算机进行网络管理 任务四:查询计算机网卡的相关信息

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

Windows下通过FastGithub加速国内GitHub访问

有时候在国内访问GitHub会非常慢&#xff0c;有时候直接打不开&#xff0c;无法访问&#xff0c;最近了解到了FastGithub 可以解决以下几个问题: github加速神器&#xff0c;解决github打不开、用户头像无法加载、releases无法上传下载、git-clone、git-pull、git-push失败等问…

刷题第二天 数组 leetcode 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

977.有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;平方后&…

Use ELK with Django Log

What is ELK? The ELK Stack is a collection of three open source products: ElasticsearchLogstashKibana When to use ELK? ELK is designed to allow us to take data from any source, in any format, and to search, analyze, visualize data in real time. At t…

Java Swing编写批量模糊替换jar包小工具

用途&#xff1a;由于jar包升级需要对之前jar包进行替换&#xff0c;而版本后缀不一致需要人工手动比对 作用&#xff1a;代码升级后&#xff0c;同一个模块jar包相同只有后缀不同&#xff0c;编写小工具进行比对进行替换名称&#xff0c;避免人工核对 技术点&#xff1a;Java …

快来看看Java在编程语言中的优势与特性吧

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 其他专栏&#xff1a;《系统解析C语言》《C语言》《C语言-语法篇》 内容分享&#xff1a…

iview ui vue2.0 radio 点击选中状态后取消选中状态

<RadioGroup v-model"formData.deficiencyType"><Radio label"1" :disabled"modalTypeC?true:false" click.native"cancelSelection(1)">1</Radio><Radio label"2" :disabled"modalTypeC?tru…

基于Java校园自助洗衣系设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

MIT6.584分布式-原MIT6.824-lab1-2023年万字从0到1小白学习笔记

文章目录 前置准备一、分布式系统知识的学习1.1分布式Go语言环境安装1.2MIT6.824课程的学习1.2* 前言学习 可以看到这个任务是不会完成的&#xff0c;在我们没有开始进行编码的时候1.3课程需求1.4怎么实现、借助课程的Hints1.5首先看看其mapfunction的工作逻辑&#xff1a; 二、…