Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Nginx Location和Rewrite深入剖析

Nginx Location和Rewrite深入剖析

作者头像
星哥玩云
发布于 2022-07-26 11:42:59
发布于 2022-07-26 11:42:59
7650
举报
文章被收录于专栏:开源部署开源部署

Nginx Location

Nginx由内核和模块组成,其中内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端的请求映射到一个location block,而location是Nginx配置中的一个指令,用于访问的URL匹配,而在这个location中所配置的每个指令将会启动不同的模块去完成相应的工作。

  • location功能是由ngx_http_index_module模块提供的。
  • location常放在server上下文。
  • location匹配与location的放置顺序无关,而是与location匹配规则的优先级有关。

常见的location匹配的URL方式如下:

符号

解释

=

字面精确匹配,精确到文件

^~

URL的前缀匹配,不支持正则

~

正则匹配检查,区分大小写

~*

正则匹配检查,不区分大小写

/

不带任何前缀

location匹配优先级如下:

(location =) > (location 完整路径)> (location ^~) > (location ~) > (location ~*) > ( location部分起始路径) > (location / )

Nginx Location规则案例:

1.只会匹配/,优先级比location / 低,= file 匹配到file的优先级最高。

location =/ {  [ configuration L1  ]  }

2.直接匹配到到file,优先级最高。

location =/index.html {  [ configuration L2  ]  }

3.可以匹配任何请求,但是因为从 / 开始匹配,所有优先级最低。

location / {  [ configuration L3  ]  }

4.匹配任何以/p_w_picpaths/开始的请求,并且停止匹配其他的loation;

location = /p_w_picpaths/ {  [ configuration L4 ]  }

5.匹配以html、txt、gif、jpg、jpeg结尾的URL文件请求, 但是所有/p_w_picpaths/目录的请求将由 [Configuration L4]处理。

location ~* \.(html|txt|gif|jpg|jpeg)$ {    [ configuration L5]  }

浏览器发起HTTP Request URI案例与Location规则案例匹配如下:

/ -> 匹配configuration L3; /index.html 匹配configuration L2;  /p_w_picpaths/ 匹配configuration L4; /p_w_picpaths/logo.png 匹配configuration L4; /img/test.jpg 匹配configuration L5。

生产环境中无需在Nginx.conf配置文件中同时添加五种规则匹配,如下为企业生产环境Nginx Location部分配置代码:

#匹配/,优先级最低 location / {     root /var/www/html/;  expires      60d; } #匹配静态页面,由本地解析 location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {  root /var/www/html/;   expires      60d;      } #匹配动态页面,交给后端服务器 location ~ .*\.(jsp|php|cgi|do)$ {     root /var/www/html/;     proxy_pass http://linux_web;     proxy_http_version 1.1;     proxy_set_header Connection "";     proxy_set_header Host  $host;     proxy_set_header X-Real-IP $remote_addr;     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    } #直接匹配newindex.html,优先级最高 location =/newindex.html {     root /var/www/newwww/;  expires      60d; }

Nginx Rewrite

Rewirte规则也称为规则重写,主要功能是实现浏览器访问HTTP URL的跳转,其正则表达式是基于Perl语言。通常而言,几乎所有的WEB服务器均可以支持URL重写。

Rewrite URL规则重写的用途:

  • 对搜索引擎优化(Search Engine Optimization,SEO)友好,利于搜索引擎抓取网站页面;
  • 隐藏网站URL真实地址,浏览器显示更加美观;
  • 网站变更升级,可以基于Rewrite临时重定向到其他页面。
  • Nginx Rewrite是由ngx_http_rewrite_module模块提供;
  • Nginx Rewrite可以使用正则替换URL,返回重定向页面。
  • Nginx Rewrite是按顺序进行匹配的。
  • Nginx Rewrite放在server,location,if上下文。

Nginx Rewrite规则使用中有三个概念需要理解,分别是:Rewrite结尾标识符、Rewrite规则常用表达式、Nginx Rewrite变量,如下为三个概念的详解:

Rewrite结尾标识符:由于Rewrite规则末尾,表示规则的执行属性。

1.last :相当于Apache里的(L)标记,表示完成rewrite匹配,匹配完成后还会向下继续匹配。

2.break:本条规则匹配完成后,终止匹配,不再匹配后面的规则.

3.redirect:返回302临时重定向,浏览器地址会显示跳转后的URL地址。

4.permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。

其中last和break用来实现URL重写时,浏览器地址栏URL地址不变。

Rewrite规则常用表达式:要用于匹配参数、字符串及过滤设置。

符号

意义

.

匹配任何单个字符

[word]

匹配字符串word

[^word]

不匹配字符串word

aa|bb

可选择字符串aa|bb

?

匹配0到1个字符

*

匹配0到多个字符

+

匹配1到多个字符

^

字符串开始标志

$

字符串结尾标志

\n

转义字符

Rewrite变量:常用于匹配HTTP请求头信息、浏览器主机名、URL等。

HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT; connection & request: REMOTE_ADDR, QUERY_STRING; server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL; system stuff: TIME_YEAR, TIME_MON, TIME_DAY。

详解如下: HTTP_USER_AGENT  用户使用的代理,例如浏览器; HTTP_REFERER 告知服务器,从哪个页面来访问的; HTTP_COOKIE            客户端缓存,主要用于存储用户名和密码等信息; HTTP_HOST 匹配服务器ServerName域名; HTTP_ACCEPT 客户端的浏览器支持的MIME类型; REMOTE_ADDR 客户端的IP地址 QUERY_STRING URL中访问的字符串; DOCUMENT_ROOT        服务器发布目录; SERVER_PORT 服务器端口; SERVER_PROTOCOL 服务器端协议; TIME_YEAR 年; TIME_MON 月; TIME_DAY 日;

补充: if指令:

语法: if (condition) { ... } 默认值: — 上下文: server, location

计算指定condition的值。计算指定的condition的值。如果为真,执行定义在大括号中的rewrite模块指令,并将if指令中的配置指定给请求。if指令会从上一层配置中继承配置。

condition为下:

条件

解释

变量名

如何变量值为空或者以0开始的字符串,则为假

=

运算符等于,则为真

!=

运算符不等于,则为真

~

大小写敏感,匹配变量和正则

~*

大小写不敏感,匹配变量和正则

-f | !-f

检查文件是否存在

-d | !-d

检查目录是否存在

-e | !-e

检查文件,目录或符号链接是否存在

-x | !-x

检查是否是可执行文件

Nginx Rewrite案例

1.将www.abc1.com 跳转到 www.abc2.com

if ( $host = 'www.abc1.com' ){    rewrite ^/(.*)$ http://www.abc2.com/$1 permanent;  }

2.访问www.abc1.com跳转www.abc1.com/newindex.html

rewrite ^/$ http://www.abc1.com/newindex.html permanent;

3.访问/test/跳转到www.abc1.com/newindex.html

rewrite ^/test/$ http://www.abc1.com/newindex.html permanent;

4.多域名跳转到 www.abc1.com

if ( $host != 'www.abc1.com' ) {  rewrite ^/(.*)$  http://www.abc1.com/$1  permanent;  }

5.访问文件和目录不存在跳转至index.html。

if ( !-e $request_filename )  {  rewrite  ^/(.*)$  /index.html  last;  }

6.目录对换 /xxxx/123456 ====> /xxxx?id=123456

rewrite ^/(.+)/(\d+)  /$1?id=$2 last;

7.判断浏览器User Agent跳转。

if( $http_user_agent  ~ MSIE) { rewrite ^(.*)$ /ie/$1 break; }

8.禁止访问以.sh,.flv,.mp3为文件后缀名的文件。

location ~ .*\.(sh|flv|mp3)$  {  return 403;  }

9.将移动用户访问跳转至移动端。

if ( $http_user_agent ~* "(Android)|(iPhone)|(Mobile)|(WAP)|(UCWEB)" )  {  rewrite ^/$      http://m.linuxidc.net/      permanent;  }

10.匹配URL访任意字符串后面含有?tid=13就跳转,$args 表示任意字符串

if ( $args ~* tid=13 ){  return 404; }

11.访问/10690/jj/123跳转至/index.php?tid/10690/items=123,[0-9]表示任意一个数字,+表示多个,(.+)表示任何多个字符。

rewrite  ^/([0-9]+)/jj/(.+)$    /index.php?tid/$1/items=$2    permanent;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
哈希表基本概念介绍及哈希冲突的处理方法(附源码)
  哈希表(散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希(散列)函数,存放记录的数组叫做哈希(散列)表。
嵌入式与Linux那些事
2021/05/20
9310
哈希表基本概念介绍及哈希冲突的处理方法(附源码)
数据结构之哈希表(HASH)
   当我们在编程过程中,往往需要对线性表进行查找操作。在顺序表中查找时,需要从表头开始,依次遍历比较a[i]与key的值是否相等,直到相等才返回索引i;在有序表中查找时,我们经常使用的是二分查找,通过比较key与a[i]的大小来折半查找,直到相等时才返回索引i。最终通过索引找到我们要找的元素。    但是,这两种方法的效率都依赖于查找中比较的次数。我们有一种想法,能不能不经过比较,而是直接通过关键字key一次得到所要的结果呢?这时,就有了散列表查找(哈希表)。
全栈程序员站长
2022/07/21
5920
数据结构之哈希表(HASH)
散列表
http://blog.csdn.net/yyxaf/article/details/7527878 搜索关键词:散列函数、散列表、哈希函数、哈希表、Hash函数、Hash表 散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O(1)。 散列表的概念 1、散列表 设所有可能出现的关键字集合记为U(简称全集)。实际发生(即实际存储)的关键字集合记为K(|K|比|U|小得多)。 散列方
用户1624346
2018/04/17
1K0
【408&数据结构】散列 (哈希)知识点集合复习&考点题目
散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(O(1)),但最坏情况下可能会退化到(O(n))。
苏泽
2024/09/09
2830
【408&数据结构】散列 (哈希)知识点集合复习&考点题目
重温数据结构:哈希 哈希函数 哈希表
该文介绍了计算机科学中的哈希表(Hash Table)及其在编程中的应用。哈希表是一种数据结构,可以高效地完成查找、插入、删除等操作。文章还介绍了哈希函数、哈希冲突、拉链法等概念。
张拭心 shixinzhang
2018/01/05
2.7K1
重温数据结构:哈希 哈希函数 哈希表
【数据结构】什么是哈希表(散列表)?
在正式开始深入了解哈希表之前呢, 我想带大家先回忆一下生活中咱们的这个"老朋友"。可能你会感到诧异, 我怎么会和它是"老朋友"呢? 别急, 其实你的生活中常常会出现哈希的身影,只是你没有细心观察罢了,不信你看下面几个场景对你来说是不是非常熟悉呢:
修修修也
2024/10/06
2550
【数据结构】什么是哈希表(散列表)?
《大话数据结构》 查找 以及一个简单的哈希表例子
第八章 查找 定义:查找就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。 8.2 查找概论 查找表(Search table):是由同一类型的数据元素构成的集合。 关键字(key):是数据元素中某个数据项的值,又称为键值。 若此关键字可以唯一的标识一个记录,则称此关键字为主关键字(Primary key)。 对于那些可以识别多个数据元素的关键字,我们称为次关键字(Secondary key)。 查找表按照操作方式来分有两大种:静态查找表和动态查找表 静态查找表(Static
xcywt
2018/03/28
2.4K0
《大话数据结构》 查找 以及一个简单的哈希表例子
数据结构:查找
衡量标准:查找过程中对关键字的平均比较次数——平均查找长度ASL。设查找到第i个元素的概率为p,比较次数为c,则查找成功的ASL_{succ}=\sum^n_{i=1}p_ic_i
ttony0
2022/12/26
9870
数据结构:查找
【数据结构】哈希表
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为 $O(N)$ ,平衡树中为树的高度,即 $O(logN)$ ,搜索的效率取决于搜索过程中元素的比较次数。
椰椰椰耶
2024/09/20
1120
【数据结构】哈希表
【经验分享】数据结构——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)
的哈希表,插入一组关键字 [10, 22, 31, 4, 15, 28],并使用线性探测解决冲突。
命运之光
2024/08/17
2330
[算法] 开放寻址法解决哈希冲突方式
开放寻址法:又称开放定址法,当哈希冲突发生时,从发生冲突的那个单元起,按照一定的次序,从哈希表中寻找一个空闲的单元,然后把发生冲突的元素存入到该单元。这个空闲单元又称为开放单元或者空白单元。开放寻址法需要的表长度要大于等于所需要存放的元素数量,非常适用于装载因子较小(小于0.5)的散列表。
唯一Chat
2020/12/31
4K0
哈希表总结
之前给大家介绍了链表,栈和队列今天我们来说一种新的数据结构散列(哈希)表,散列是应用非常广泛的数据结构,在我们的刷题过程中,散列表的出场率特别高。所以我们快来一起把散列表的内些事给整明白吧,文章框架如下。
宿春磊Charles
2022/03/29
7390
哈希表总结
散列表(哈希表)
版权声明:本文为博主原创文章,转载请注明博客地址: https://blog.csdn.net/zy010101/article/details/83998492
zy010101
2019/05/25
7540
程序员必读:教你摸清哈希表的脾气
在哈希表中,记录的存储位置 = f (关键字),通过查找关键字的存储位置即可,不用进行比较。散列技术是在记录的存储位置和它的关键字之间建立一个明确的对应关系f 函数,使得每个关键字 key 对应一个存储位置 f(key) 且这个位置是唯一的。这里我们将这种对应关系 f 称为散列函数,又称为哈希(Hash)函数。采用散列技术将记录存储在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表(Hash table)。
谭庆波
2018/08/10
3930
程序员必读:教你摸清哈希表的脾气
进阶 | 我实现了javascript 哈希表,并进行性能比较
前端爱好者的聚集地 javascript的对象就是一个哈希表,为了学习真正的数据结构,我们还是有必要自己重新实现一下。 基本概念 哈希表(hash table )是一种根据关键字直接访问内存存储位置的数据结构,通过哈希表,数据元素的存放位置和数据元素的关键字之间建立起某种对应关系,建立这种对应关系的函数称为哈希函数。 哈希表的构造方法 假设要存储的数据元素个数是n,设置一个长度为m(m > n)的连续存储单元,分别以每个数据元素的关键字Ki(0<=i<=n-1)为自变量,通过哈希函数hash(Ki),把
用户1097444
2022/06/29
6930
进阶 | 我实现了javascript 哈希表,并进行性能比较
数据结构 之 哈希表
哈希表(Hash table) 又称为散列表,是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做哈希表。
AUGENSTERN_
2024/04/23
1.3K0
数据结构 之 哈希表
数据结构与算法之哈希表
哈希表也叫散列表。 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
袁新栋-jeff.yuan
2020/08/26
7570
什么是散列表(哈希表)?
假设你们班级100个同学每个人的学号是由院系-年级-班级和编号组成,例如学号为01100168表示是1系,10级1班的68号。为了快速查找到68号的成绩信息,可以建立一张表,但是不能用学号作为下标,学号的数值实在太大。因此将学号除以1100100取余,即得到编号作为该表的下标,那么,要查找学号为01100168的成绩的时候,只要直接访问表下标为68的数据即可。这就能够在O(1)时间复杂度内完成成绩查找。
编程珠玑
2019/07/12
6580
海量数据处理
  针对海量数据的处理,可以使用的方法非常多,常见的方法有hash法、Bit-map法、Bloom filter法、数据库优化法、倒排索引法、外排序法、Trie树、堆、双层桶法以及MapReduce法。 1、hash法 hash法也成为散列法,它是一种映射关系,即给定一个元素,关键字是key,按照一个确定的散列函数计算出hash(key),把hash(key)作为关键字key对应的元素的存储地址,再进行数据元素的插入和检索操作。   散列表是具有固定大小的数组,表长应该是质数,散列函数是用于关键字和存储
Mister24
2018/05/14
2.2K0
数据结构 Hash表(哈希表)
参考链接:数据结构(严蔚敏) 文章发布很久了,具体细节已经不清晰了,不再回复各种问题 文章整理自严蔚敏公开课视频 可以参考 https://www.bilibili.com/video/av22258871/ 如果链接失效 可以自行搜索 数据结构严蔚敏视频 @2021/07/12
全栈程序员站长
2022/09/15
1.3K0
相关推荐
哈希表基本概念介绍及哈希冲突的处理方法(附源码)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档