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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实例讲解Nginx下的rewrite规则
一.正则表达式匹配,其中: * ~ 为区分大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 二.文件及目录匹配,其中: * -f和!-f用来判断是否存在文件 * -d和!-d用来判断是否存在目录 * -e和!-e用来判断是否存在文件或目录 * -x和!-x用来判断文件是否可执行 三.rewrite指令的最后一项参数为flag标记,flag标记有: 1.last    相当于apache里面的[L]标记,表示rewrite。 2.break本条规则匹配完成后,终止匹配,不再匹配后面的规则。 3.redirect  返回302临时重定向,浏览器地址会显示跳转后的URL地址。 4.permanent  返回301永久重定向,浏览器地址会显示跳转后的URL地址。
星哥玩云
2022/06/29
6310
Nginx:rewrite 的几个技巧
在软件的发布中,我们经常会使用到 Nginx,Nginx 的功能非常的庞杂,其中 rewrite 是一个非常常用的功能模块,本文介绍 rewrite 的基本概念和几个小技巧。
oec2003
2020/07/09
1.2K0
Nginx:rewrite 的几个技巧
第八章·Nginx实现Rewrite重写
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
6490
第八章·Nginx实现Rewrite重写
Nginx Location 匹配规则
Nginx 的 location 用于匹配 URI 不同路径的请求,实现对请求的细分处理。例如当客户端请求 https://www.nginx-test.com/index.html 时,Nginx 使用本地的静态文件响应,而当客户端请求相同地址的 https://www.nginx-test.com/api 时,Nginx 将请求转发到后端服务器。
Se7en258
2021/07/01
1.5K0
手把手教你,嘴对嘴传达------深入介绍Nginx的rewrite模块(理论加实验)
location = patt {} [精准匹配] ocation patt {} [一般匹配 ] location ~ patt {} [正则匹配]
不吃小白菜
2020/09/03
7160
手把手教你,嘴对嘴传达------深入介绍Nginx的rewrite模块(理论加实验)
Nginx中location、rewrite使用方法
矫正: location 的匹配顺序其实是“先匹配普通,再匹配正则”。我这么说,大家一定会反驳我,因为按“先匹配普通,再匹配正则”解释不了大家平时习惯的按“先匹配正则,再匹配普通”的实践经验。这里我只能暂时解释下,造成这种误解的原因是:正则匹配会覆盖普通匹配。
星哥玩云
2022/07/28
1.2K0
Nginx中location、rewrite使用方法
nginx中的location & root & alias & rewrite
注意: alias只能用于location中(使用alias,目录名后面一定要加“/”),而root可以用在http、server和location中。
阿dai学长
2019/04/03
2.9K0
nginx配置 location及rewrite规则详解
1. location正则写法 语法规则: location [=|~|~*|^~] /uri/ { … } =    开头表示精确匹配 ^~  开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。 ~   开头表示区分大小写的正则匹配 ~*  开头表示不区分大小写的正则匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则 / 通用匹配,任何请求都会匹
用户1214487
2018/05/28
2.9K0
Nginx系列教程(7)nginx rewrite配置规则详细说明
注:nginx官方文档:http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
haikangweishi
2020/04/07
7.4K0
nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
Nginx除了可以用作web服务器外,他还可以用来做高性能的反向代理服务器,它能提供稳定高效的负载均衡解决方案。nginx可以用轮询、IP哈希、URL哈希等方式调度后端服务器,同时也能提供健康检查功能。目前有众多公司均已经部署使用nginx实现基于七层的负载均衡功能。 1)Nginx负载均衡 为了实现Nginx的反向代理以及负载均衡功能,应用中需要用到两个模块,HttpProxyModule和HttpUpstreamModule模块;其中HttpProxyModule模块的作用是将用户的数据请求转发到其他服
洗尽了浮华
2018/01/23
8K0
nginx负载均衡(5种方式)、rewrite重写规则及多server反代配置梳理
Nginx location匹配规则
上述配置,默认访问/会重定向到/my-module, 然后直接返回/data/my-module/dist下的html等静态文件。
Ryan-Miao
2019/06/18
2K0
Nginx Rewrite 重写URI
不知不觉 nginx主题的文章写了60+篇,有最早的也有最近的,有些是记录安装配置,有些是记录问题解决方法,内容质量有深也有浅参差不齐,随着技术迭代有些文章已经过时了(例如Docker时代)不再符合当前的技术需求,而有些文章虽然久远但是仍有有意义(例如Nginx HA),所以有了梳理这些文章的想法,目标有两个吧,一是回顾下过去的文章巩固下知识点,二是去其糟粕留下精华将有价值的文章搬迁(搬砖)的微信公众号。
用户1560186
2019/11/19
2.9K0
04 . Nginx的Rewrite重写
Nginx Rewrite相关指令有重定向rewrite,if 语句,条件判断,全局变量,set,return
iginkgo18
2020/09/27
3K0
【NGINX入门】6.Nginx的rewrite规则详解
nginx Rewrite规则可以让网站的url中达到某种状态时定向/跳转到某个规则,本文具体介绍这些规则和说明。
辉哥
2021/02/04
4.5K0
Nginx配置location总结及rewrite规则写法
location = / {     # 精确匹配 /,主机名后面不能带任何字符串     [ configuration A ]  } location / {     # 因为所有的地址都以/开头,所有这条规则将匹配到所有请求     # 但是正则和最长字符串会优先匹配     [ configuration B ] } location /documents/ {     # 匹配任何以/documents/开头的地址,匹配符合以后,还要继续往下搜索     # 只有后面的正则表达式没有匹配到时,这一条才会采用     [ configuration C ] } location ~ /documents/Abc {     # 匹配任何以 /documents/开头的地址,匹配符合以后,还要继续往下搜索     # 只有后面的正则表达式没有匹配到时,才会采用这一条      [ configuration CC ] } location ^~ /images/ {     # 匹配任何以/images/开头的地址,匹配符合以后,停止往下搜索正则,采用这一条     [ configuration D ] } location ~* \.(gif|jpg|jpeg)$ {     # 匹配所有以gif,jpg或jpeg结尾的请求     # 然而,苏朋友请求/images/下的图片会被config D处理,因为^~到达不了这一正则     [ configuration E ] } location /images/ {     # 字符匹配到 /images/,继续往下,会发现^~存在     [ configuration F ] } location /images/abc {     # 最长字符匹配到/images/abc,继续往下,会发现^~存在     # F与G的放置顺序是没有关系的     [ configuration G ] } location ~ /images/abc/ {     # 只有去掉config D才有效:先最长匹配config G开头的地址,继续往下搜索,匹配到这一正则,采用     [ configuration H ] } location ~* /js/.*/\.js
星哥玩云
2022/07/29
1.1K0
nginx之rewrite详解1
URL重写有利于网站首选域的确定,对于同一资源页面多条路径的301重定向有助于URL权重的集中。
随心助手
2019/10/15
1.9K0
nginx location配置
编写本文时,使用的nginx版本为nginx/1.17.9和nginx/1.16.1
腾讯IVWEB团队
2020/09/22
3.7K1
nginx的location、rewrite玩法详解
顺序 no优先级: (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
sunsky
2020/08/20
1.2K0
Nginx-基础总结(上)
1.proxy_set_header :在将客户端请求发送给后端服务器之前,更改来自客户端的请求头信息。 2.proxy_connect_timeout:配置Nginx与后端代理服务器尝试建立连接的超时时间。 3.proxy_read_timeout : 配置Nginx向后端服务器组发出read请求后,等待相应的超时时间。 4.proxy_send_timeout:配置Nginx向后端服务器组发出write请求后,等待相应的超时时间。 5.proxy_redirect :用于修改后端服务器返回的响应头中的Location和Refresh。
云计算小黑
2022/12/28
4530
Nginx之location详解
3、一旦配置请求location映射到了指定的位置,那么下面全部的文件夹和文件都可以映射到,不需要在配置对其的映射,比如,但是如果使用其中的文件名重新映射了地址,那么这个路径将不能使用
爱撒谎的男孩
2019/12/31
8990
相关推荐
实例讲解Nginx下的rewrite规则
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档