深入探索 Nginx 的 URL 重写与位置匹配

2024-08-24 08:04

本文主要是介绍深入探索 Nginx 的 URL 重写与位置匹配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 深入探索 Nginx 的 URL 重写与位置匹配
  • 官方文档
  • 一、Nginx 正则表达式基础
  • 二、rewrite 和 location 的区别
  • 三、rewrite 指令详解
  • 四、rewrite 跳转实现
  • 五、rewrite 语法格式及 flag 说明
      • flag 标记说明
  • 六、location 指令详解
      • location 常用的匹配规则
      • location 优先级
  • 七、location 示例说明
      • 7.1 示例 1:精准匹配
      • 7.2 示例 2:一般匹配
      • 7.3 示例 3:正则匹配
  • 八、location 匹配优先级总结
  • 九、rewrite 实际应用示例
      • 9.1 基于域名的跳转
      • 9.2 基于客户端 IP 访问跳转
      • 9.3 基于旧域名跳转到新域名加目录
      • 9.4 基于参数匹配的跳转
      • 9.5 基于目录下所有 php 结尾的文件跳转
      • 9.6 基于最普通一条 URL 请求的跳转

深入探索 Nginx 的 URL 重写与位置匹配

官方文档

  • ngx_http_rewrite_module
  • ngx_http_rewrite_module if 条件

一、Nginx 正则表达式基础

Nginx 正则表达式是用于匹配和重写 URL 的强大工具。下面是常用的 Nginx 正则表达式符号及其含义:

  • ^ :匹配输入字符串的起始位置。
  • $ :匹配输入字符串的结束位置。
  • * :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”。
  • + :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”。
  • ? :匹配前面的字符零次或一次,例如“od(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 和 location 的区别

从功能上看,rewritelocation 似乎都有实现跳转的能力。主要区别在于 rewrite 是在同一域名内更改获取资源的路径,而 location 是对一类路径进行访问控制或反向代理,还可以通过 proxy_pass 将请求代理到其他机器。

三、rewrite 指令详解

rewrite 功能就是使用 Nginx 提供的全局变量或自定义变量,结合正则表达式和标记位实现 URL 重写及重定向。常见的应用场景包括域名变更后的跳转、网页地址更改后的跳转以及网站防盗链等。

rewrite 指令只能放在 server{}, location{}, if{} 块中,并且默认只能对域名后面的路径进行重写,不包括传递的参数。例如,http://www.kgc.com/abc/bbs/index.php?a=1&b=2 只会对 /abc/bbs/index.php 进行重写。

四、rewrite 跳转实现

Nginx 通过 ngx_http_rewrite_module 模块支持 URL 重写和 if 条件判断,但不支持 else。跳转时,从一个 location 跳转到另一个 location 的次数最多为 10 次,超过后 Nginx 将返回 500 错误。该模块还支持 Perl 兼容正则表达式的语法规则匹配,以及通过 set 指令创建新变量并赋值。

rewrite 执行顺序如下:

  1. 执行 server 块里面的 rewrite 指令。
  2. 执行 location 匹配。
  3. 执行选定的 location 中的 rewrite 指令。

五、rewrite 语法格式及 flag 说明

语法格式:

rewrite <regex> <replacement> [flag];
  • regex :表示正则匹配规则。
  • replacement :表示跳转后的内容。
  • flag :表示 rewrite 支持的标记。

flag 标记说明

  • last :本条规则匹配完成后,继续向下匹配新的 location URL 规则,一般用在 serverif 中。
  • break :本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
  • redirect :返回 302 临时重定向,浏览器地址会显示跳转后的 URL 地址。
  • permanent :返回 301 永久重定向,浏览器地址栏会显示跳转后的 URL 地址。

六、location 指令详解

location 大致可以分为三类:

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

location 常用的匹配规则

  • = :进行普通字符精确匹配,完全匹配时触发。
  • ^~ :表示普通字符匹配,使用前缀匹配。如果匹配成功,则不再匹配其它 location
  • ~ :区分大小写的正则匹配。
  • ~* :不区分大小写的正则匹配。
  • !~ :区分大小写的匹配取非。
  • !~* :不区分大小写的匹配取非。

location 优先级

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

七、location 示例说明

7.1 示例 1:精准匹配

location = / 精确匹配根路径,通常用于处理网站的首页访问。此规则优先级最高,只要请求的路径完全匹配 /,就会触发此规则。

7.2 示例 2:一般匹配

location / {} 匹配所有以 / 开头的请求,这是一个最为通用的匹配规则,但优先级较低。

7.3 示例 3:正则匹配

location ~* \.(gif|jpg|jpeg)$ {} 匹配所有以 .gif.jpg.jpeg 结尾的请求。此规则适用于需要区分文件类型的情况。

八、location 匹配优先级总结

  • 精确匹配优先级最高
  • 其次是 ^~ 前缀匹配
  • 正则匹配(~~*)次之
  • 最后是通用的 / 匹配

九、rewrite 实际应用示例

9.1 基于域名的跳转

旧域名 www.kgc.com 需要跳转到新域名 www.benet.com,可以使用以下配置:

server {listen       80;server_name  www.kgc.com;if ($host = 'www.kgc.com'){rewrite ^/(.*)$ http://www.benet.com/$1 permanent;}root   html;index  index.html index.htm;
}

9.2 基于客户端 IP 访问跳转

所有 IP 访问显示维护页面,只有公司 IP 192.168.10.19 可以正常访问:

server {listen       80;server_name  www.kgc.com;set $rewrite true;if ($remote_addr = "192.168.10.19"){set $rewrite false;}if ($rewrite = true){rewrite (.+) /weihu.html;}location = /weihu.html {root /var/www/html;}location / {root   html;index  index.html index.htm;}
}

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

旧域名 bbs.kgc.com/post/ 需要跳转到新域名 www.kgc.com/bbs/post/

server {listen       80;server_name  bbs.kgc.com;location /post {rewrite (.+) http://www.kgc.com/bbs$1 permanent;}location / {root   html;index  index.html index.htm;}
}

9.4 基于参数匹配的跳转

访问 `http://www.kgc.com/100-(100

|200)-100.html跳转到http://www.kgc.com`:

server {listen       80;server_name  www.kgc.com;if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {rewrite (.+) http://www.kgc.com permanent;}location / {root   html;index  index.html index.htm;}
}

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

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

server {listen       80;server_name  www.kgc.com;location ~* /upload/.*\.php$ {rewrite (.+) http://www.kgc.com permanent;}location / {root   html;index  index.html index.htm;}
}

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

访问 http://www.kgc.com/abc/123.html 跳转到首页:

server {listen       80;server_name  www.kgc.com;location ~* ^/abc/123.html {rewrite (.+) http://www.kgc.com permanent;}location / {root   html;index  index.html index.htm;}
}

80;
server_name www.kgc.com;
location ~* ^/abc/123.html {
rewrite (.+) http://www.kgc.com permanent;
}
location / {
root html;
index index.html index.htm;
}
}


这篇关于深入探索 Nginx 的 URL 重写与位置匹配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101904

相关文章

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

hdu 3065 AC自动机 匹配串编号以及出现次数

题意: 仍旧是天朝语题。 Input 第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。 接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。 在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时