Nginx rewrite

目录

一、location

1.location 匹配规则介绍

2. 实际网站使用中匹配规则

2.1第一个必选规则

2.2第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

2.3第三个规则就是通用规则

3.location 匹配规则演示

2.1一般前缀匹配

2.2正则匹配

2.3正则前缀匹配

2.4精准匹配

二、rewrite

1.rewrite介绍

1.1rewrite功能 

1.2rewrite重写跳转 

2.rewrite命令的执行

2.1rewrite执行顺序 

2.2rewrite语法格式

3.rewrite 示例

3.1基于域名的跳转

3.2基于客户端IP访问跳转

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

3.4 基于参数匹配的跳转


一、location

1.location 匹配规则介绍

location 匹配规则分类:

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

location 常用匹配规则:

  • =:进行普通字符精准匹配,也就是完全匹配即匹配路径与访问路径完全一致。
  • ^~:表示普通字符匹配。使用前缀匹配,如果匹配成功,则不再匹配其它正则匹配 location
  • ~:区分大小写的匹配。
  • ~*:不区分大小写的匹配。
  • !~:区分大小写的匹配取非。
  • !~*:不区分大小写的匹配取非。 

location 优先级:

  1. 首先精准匹配 =
  2. 其次前缀匹配 ^~
  3. 其次是按文件中顺序的正则 ~ 或~*,正则匹配到以后,不再向下匹配
  4. 然后匹配不带任何修饰符的一般前缀匹配
  5. 最后是交给 / 通用匹配 

总结:

  • 精准匹配= > 正则前缀匹配^~ > 正则匹配 > 一般前缀匹配 > 通用匹配 
  • 正则匹配:一旦匹配到,则不再向下匹配

location 示例说明:

  1. location = / {}:=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配;再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。
  2. location / {}:因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 比如访问 / 和 /data, 则 / 匹配, /data 也匹配,但后面前缀路径会和最长字符串优先匹配(最长匹配)
  3. location /documents/ {}:匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索其它 location;只有其它 location后面的前缀路径没有匹配到时,才会采用这一条
  4. location /documents/abc {}:匹配任何以 /documents/abc 开头的地址,匹配符合以后,还要继续往下搜索其它 location;只有其它 location后面的前缀路径没有匹配到时,才会采用这一条
  5. location ^~ /images/ {}:匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条
  6. location ~* \.(gif|jpg|jpeg)$ {}:匹配所有以 gif、jpg或jpeg 结尾的请求。然而,所有请求 /images/ 下的图片会被 location ^~ /images/ 处理,因为 ^~ 的优先级更高,所以到达不了这一条正则
  7. location /images/abc {}:最长字符匹配到 /images/abc,优先级最低,继续往下搜索其它 location,会发现 ^~ 和 ~ 存在
  8. location ~ /images/abc {}:匹配以/images/abc 开头的,优先级次之,只有去掉 location ^~ /images/ 才会采用这一条
  9. location /images/abc/1.html {}:匹配/images/abc/1.html 文件,如果和正则location ~ /images/abc/1.html 相比,正则优先级更高

2. 实际网站使用中匹配规则

2.1第一个必选规则

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

2.2第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项

有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
    root /webroot/;
}

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

2.3第三个规则就是通用规则

比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器
非静态文件请求就默认是动态请求
location / {
    proxy_pass http://tomcat_server;
}

3.location 匹配规则演示

2.1一般前缀匹配

#将原本配置文件备份
mv /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak
#还原配置文件
mv /usr/local/nginx/conf/nginx.conf.default /usr/local/nginx/conf/nginx.conf 

vim /usr/local/nginx/conf/nginx.conf

       location / {                    #通用配置
            root   html;
            index  index.html index.htm;
        }

        location /abc {                #一般前缀匹配
                root /var/www;
        }

        location /abc/test {           #一般前缀匹配
                root /var/data;
        }

systemctl restart nginx.service
#匹配到 /abc 则访问结果:this is test web
mkdir -p /var/www/abc/test
echo '<h1>this is test web</h1>' > 123.html
#匹配到 /abc/test 则访问结果:welcome to test web
mkdir -p /var/data/abc/test
echo '<h1>welcome to test web</h1>' > 123.html

浏览器访问验证:
http://192.168.88.40/abc/test/123.html

 

2.2正则匹配

vim /usr/local/nginx/conf/nginx.conf

       location / {                    #通用配置
            root   html;
            index  index.html index.htm;
        }

        location ~ ^/abc {                #正则匹配
                root /var/www;
        }

        location ~ ^/abc/test {           #正则匹配
                root /var/data;
        }

systemctl restart nginx.service

#匹配到 /abc 则访问结果:this is test web
mkdir -p /var/www/abc/test
echo '<h1>this is test web</h1>' > 123.html
#匹配到 /abc/test 则访问结果:welcome to test web
mkdir -p /var/data/abc/test
echo '<h1>welcome to test web</h1>' > 123.html

浏览器访问验证:
http://192.168.88.40/abc/test/123.html

 

2.3正则前缀匹配

vim /usr/local/nginx/conf/nginx.conf

       location / {                    #通用配置
            root   html;
            index  index.html index.htm;
        }

        location ~ ^/abc {                #正则匹配
                root /var/www;
        }

        location ^~ /abc/test {           #正则前缀匹配
                root /var/data;
        }

systemctl restart nginx.service

#匹配到 /abc 则访问结果:this is test web
mkdir -p /var/www/abc/test
echo '<h1>this is test web</h1>' > 123.html
#匹配到 /abc/test 则访问结果:welcome to test web
mkdir -p /var/data/abc/test
echo '<h1>welcome to test web</h1>' > 123.html

浏览器访问验证:
http://192.168.88.40/abc/test/123.html

 

2.4精准匹配

vim /usr/local/nginx/conf/nginx.conf

       location / {                    #通用配置
            root   html;
            index  index.html index.htm;
        }

        location ~ ^/abc {                #正则匹配
                root /var/www;
        }

        location ^~ /abc/test {           #正则前缀匹配
                root /var/data;
        }
        
        location = /abc/test/123.html {    #精准匹配
                root html;
        }
    

systemctl restart nginx.service

#匹配到 /abc 则访问结果:this is test web
mkdir -p /var/www/abc/test
echo '<h1>this is test web</h1>' > 123.html
#匹配到 /abc/test 则访问结果:welcome to test web
mkdir -p /var/data/abc/test
echo '<h1>welcome to test web</h1>' > 123.html
#匹配到 /abc/test/123.html 则访问结果:hello, test web
mkdir -p /usr/local/nginx/html/abc/test
echo '<h1>hello, test web</h1>' > 123.html

浏览器访问验证:
http://192.168.88.40/abc/test/123.html

 

二、rewrite

1.rewrite介绍

1.1rewrite功能 

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

rewrite 与 location 的区别:

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

1.2rewrite重写跳转 

rewrite位置: 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错误
  • PCRE支持:perl兼容正则表达式的语法规则匹配
  • 重写模块 set 指令:创建新的变量并设其值

2.rewrite命令的执行

2.1rewrite执行顺序 

rewrite 执行顺序如下:

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

2.2rewrite语法格式

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

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

3.rewrite 示例

3.1基于域名的跳转

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

vim /usr/local/nginx/conf/nginx.conf
server {
        listen       80;
        server_name  www.kgc.com;
       # 添加域名重定向 
        if ($host = 'www.kgc.com' ) {   
       #$host为rewrite全局变量,代表请求主机头字段或主机名
                rewrite ^/(.*)$ http://www.benet.com/$1 permanent;
       # $1:为正则匹配的内容,即“域名/”之后的字符串
        }

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

cd /usr/local/nginx/html
echo '<h1>this is test web</h1>' > test.html

echo "192.168.88.40 www.kgc.com www.benet.com" >> /etc/hosts
systemctl restart nginx

浏览器访问验证:
http:www.kgc.com/test.html 会跳转到 www.benet.com/test.html

 

 

3.2基于客户端IP访问跳转

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

vim /usr/local/nginx/conf/nginx.conf
 server {
        listen       80;
        server_name  www.kgc.com;
 #设置是否合法的IP标记
        set $rewrite true;       #设置变量$rewrite,变量值为boole值true
  #判断是否为合法IP       
        if ( $remote_addr = "192.168.88.40") {  #当客户端IP为192.168.88.40时,将变量值设为false,不进行重写
                set $rewrite false;
        }
 #除了合法IP,其它都是非法IP,进行重写跳转维护页面
        if ($rewrite = true) {            #当变量值为true时,进行重写
                rewrite ^/ /weihu.html;   #将域名后边的路径重写成/weihu.html后转发,例如www.kgc.com/weihu.html
        }
#网页返回/var/www/html/weihu.html的内容
        location = /weihu.html { 
                root /var/www;
        }

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

cd /usr/local/nginx/html
echo '<h1>the web is updating!</h1>' > weihu.html

systemctl restart nginx.service 

浏览器访问验证:
只有 IP 为 192.168.88.40 能正常访问,其它地址都是维护页面

###注意事项
如果rewrite ^/ /weihu.html; 换成rewrite ^/ /weihu.html permanent; 的话,
若不是 192.168.80.10 的主机访问会使浏览器修改请求访问的 URL 成 http://www.kgc.com/weihu.html 再请求访问,
这样就会进入一直在 rewrite 的死循环,访问请求会一直被重写成 http://www.kgc.com/weihu.html 再请求访问

 

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

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

vim /usr/local/nginx/conf/nginx.conf 
server {
        listen       80;
        server_name  bbs.kgc.com www.kgc.com;

        location /bbs {
                root /var/www;
        }

        location /post {
                rewrite (.+) http://www.kgc.com/bbs$1 permanent;
        }

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

mkdir -p /var/www/bbs/post
cd /var/www/bbs/post
echo '<h1>hello,world!</h1>' > 123.html

echo '192.168.88.40 bbs.kgc.com' >> /etc/hosts

systemctl restart nginx.service

使用浏览器访问 http://bbs.kgc.com/post/123.html 跳转到 http://www.kgc.com/bbs/post/123.html

 

 

3.4 基于参数匹配的跳转

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

vim /usr/local/nginx/conf/nginx.conf
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;
        }

systemctl restart nginx.service

使用浏览器访问 http://www.kgc.com/100-200-100.html 或 http://www.kgc.com/100-100-100.html 跳转到http://www.kgc.com页面。

  • $request_uri:包含请求参数的原始URI,不包含主机名,如:http://www.kgc.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 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电池状态估计 | Matlab实现利用卡尔曼滤波器估计电池充电状态

文章目录 效果一览文章概述研究内容程序设计参考资料效果一览 文章概述 电池状态估计 | Matlab实现利用卡尔曼滤波器估计电池充电状态 研究内容 目前,常用的电池模型有:数

斐波那契数列题解(非递归c++方法实现)

在做信奥赛&#xff08;信息学奥赛&#xff09;中的for循环题目时&#xff0c;有一道斐波那契数列&#xff0c;想到的第一个方法是使用递归求解&#xff1b;因为以往题目最多使用的就是递归形式&#xff0c;但鉴于该题目在for循环题目堆&#xff0c;所以就思考了一些新方法&…

仙境传说RO:添加限购物品刷新物品库存教程

仙境传说RO&#xff1a;添加限购物品刷新物品库存教程 大家好我是艾西&#xff0c;在游戏中我们会有普通的基础装备那么必然就会有到顶的套装&#xff0c;往往可能一套到顶的套装就可能霸服。那么就需要GM去做游戏的设定以及限制&#xff0c;上一篇文章中我给大家讲述了如果创…

RabbitMQ的基本概念

目录 1、MQ 的基本概念 1.1 MQ概述 1.2 MQ 的优势和劣势 1.3 MQ 的优势 1. 应用解耦 2. 异步提速 3. 削峰填谷 小结: 1.4 MQ 的劣势 1.5 常见的 MQ 产品 1.6 RabbitMQ 简介 1.7 JMS 1、MQ 的基本概念 1.1 MQ概述 MQ全称 Message Queue&#xff08;消息队列&#…

火山引擎DataLeap的Catalog系统搜索实践(三):Learning to rank与后续工作

Learning to rank Learning to rank主要分为数据收集&#xff0c;离线训练和在线预测三个部分。搜索系统是一个Data-driven system&#xff0c;因此火山引擎DataLeap的Catalog系统设计之初就需要考虑数据收集。收集的数据可以用来评估和提升搜索的效果。数据收集和在线预测前面…

Augmentation Matters:一种简单而有效的半监督语义分割方法(CVPR2023)

文章目录 Augmentation Matters: A Simple-yet-Effective Approach to Semi-supervised Semantic Segmentation摘要本文方法Random Intensity-based AugmentationsAdaptive Label-aided CutMix 实验结果 Augmentation Matters: A Simple-yet-Effective Approach to Semi-superv…

【C语言】C预处理器(宏、文件包含、条件编译...)

一、C语言编译的预处理阶段1.1 C语言的编译过程1.2 C语言编译的预处理 二、C语言 宏2.1替换常量2.2函数宏2.3 字符串化和连接&#xff1a;#和##2.4 变参宏 三、文件包含&#xff1a;#include3.1 写法3.2 头文件的作用——声明3.3 头文件和extern 、static 四、 其他指令4.1 #un…

路径之谜 2016年国赛 深度优先搜索

目录 解题思路 AC代码&#xff1a; 题目描述 小明冒充 XX 星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 nn 个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或纵向…

公司新来一00后,真让人崩溃...

2022年已经结束结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备今年的金九银十的面试计划。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的…

Executor框架的两级调度模型

Executor框架的两级调度模型 在HotSpot VM的线程模型中Java线程&#xff08;java.lang.Thread&#xff09;被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程&#xff1b;当该Java线程终止时&#xff0c;这个操作系统线程也会被回收。操作系统会调度…

计算机网络-网络层与链路层协议分析实验

一.实验目的 通过本实验&#xff0c;进一步熟悉PacketTracer的使用&#xff0c;学习路由器与交换机的基本配置&#xff0c;加深对网络层与链路层协议的理解。 二.实验内容 1.完成路由器交换机的基本配置 2.了解 ICMP 数据包的格式 3.检查ARP交换 三.实验过程 1.完成路由…

【Python】Python系列教程-- Python3 列表(十二)

文章目录 前言访问列表中的值更新列表删除列表元素Python列表截取与拼接嵌套列表列表比较Python列表函数&方法 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09;Python系列…

【熬夜送书 | 第四期】python期末考试总结

文章目录 前言单选题程序填空题函数题编程题熬夜送书 第三期 前言 博主也是第一次接触到python语言&#xff0c;在考试前过了一遍python语法&#xff0c;因为有Java基础学习起来相对比较轻松&#xff0c;学校考的题相对简单一些&#xff0c;也是PTA上机考试&#xff0c;大概30…

一文说透ES6中的箭头函数表达式

一 总述 ​箭头函数表达式的语法比函数表达式更简洁&#xff0c;并且没有自己的this&#xff0c;arguments&#xff0c;super或new. target。箭头函数表达式更适用于那些本来需要匿名函数的地方&#xff0c;并且它不能用作构造函数。 二 详细 1 1个或多个参数 (param1, par…

Linux 实操篇-进程管理(重点)

Linux 实操篇-进程管理(重点) 基本介绍 在LINUX 中&#xff0c;每个执行的程序都称为一个进程。每一个进程都分配一个ID 号(pid,进程号)。>windows > linux每个进程都可能以两种方式存在的。前台与后台&#xff0c;所谓前台进程就是用户目前的屏幕上可以进行操作的。后…

基于matlab仿真带有飞机的虚拟场景

一、前言 此示例演示如何通过 MATLAB接口使用空间鼠标。 开始此示例后&#xff0c;带有飞机的虚拟场景将显示在 Simulink 3D 动画查看器中。您可以使用空格鼠标在场景中导航平面。通过按下设备按钮 1&#xff0c;您可以在当前平面位置放置标记。 此示例需要空间鼠标或其他兼容设…

chatgpt赋能python:Python就业学历要求

Python 就业学历要求 Python 是一门广泛应用于数据科学、人工智能、Web 开发和自动化等领域的编程语言&#xff0c;正在迅速成为行业内最受欢迎的语言之一。如果你想进入这些领域从事相关职业&#xff0c;那么 Python 编程技能将是你的一个优势。但是&#xff0c;Python 就业所…

【LeetCode全题库算法速练】2、两数相加

文章目录 一、题目&#x1f538;题目描述&#x1f538;样例1&#x1f538;样例2&#x1f538;样例3 二、代码参考 作者&#xff1a;KJ.JK &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &a…

深入浅出讲解闭包及其原理

闭包 什么是闭包&#xff1f; 闭包的概念并不复杂&#xff0c;但是它的定义比较绕&#xff08;就像平时经常用到它&#xff0c;却又说不出来是什么&#xff09;。可以在一个作用域中调用函数的内部函数并访问到该函数中的作用域的成员&#xff0c;这就是闭包。给一个建议&…

“大四在读生”都四面成功拿到字节跳动Offer了,你还有什么理由去摸鱼?

博主大四在读&#xff0c;投的是字节 Data 的软件测试岗位实习生&#xff0c;base 杭州。 时间线&#xff1a; 4.12 投递4.13 安排简历筛选4.14 安排面试4.19 16:00 一面4.22 16:00 二面 4.23 8:00 三面4.23 16:00 HR 面4.23 16:30 Offer 一面 你对字节跳动的了解和认知有哪…