Nginx Location匹配 和 Rewrite重写

news2025/1/13 15:54:50

前言:Nginx 正则表达式

^匹配输入字符串的起始位置
$匹配输入字符串的结束位置
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
匹配前面的字符零次或一次
.匹配除 “\n” 之外的任何单个字符
\将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用
\d匹配纯数字
{n}重复n次
{n,}重复n次或者更多次
[c]匹配单个字符c
[a-z]匹配a-z小写字母的任意一个
[a-zA-Z]匹配a-z小写字母或A-Z大写字母的任意一个

一.location 

location 通过前缀或正则匹配用户的URL访问路径做页面跳转、访问控制和代理转发

1.location 的分类

精确匹配 : location =  /  {.....}

一般匹配 : location  / {.....}

正则匹配 : location ~  /  {.....}

2. location 常用的匹配规则

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

3.location 优先级

相同类型的表达式,字符串长的会优先匹配

按优先级排列(从上往下排序)

(1)=  类型

(2)^~  类型表达式

(3)正则表达式 (~和~*)  类型

(4)常规字符串匹配类型,按前缀匹配

(5)通用匹配 (/) ,如果没有其它匹配,任何请求都会匹配到

4.location匹配机制

在没有合适的精准匹配的情况下,先看前缀匹配的长度,取最长匹配的location(如果此最长匹配是带有^~的则不再看正则匹配;如果此最长匹配是不带有^~的则会继续再看正则匹配)

前缀匹配看长度,最长的优先匹配;正则匹配看上下顺序,根据nginx配置文件的配置由上往下依次匹配,匹配到即停止

5.实际使用

实际网站使用中,至少有三个匹配规则定义:

(1)第一个必选规则

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

location = / {
    root 网页根目录;
	index index.html;
}


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

(2)第二个必选规则

是处理静态文件请求,这是nginx作为http服务器的强项
通过目录缀匹配、文件名后缀匹配或通用匹配在nginx服务器本地处理

location ~ /static/ {
    root 目录;
}

location / {
    root 目录;
}


location ^~ /static/ {
    root /webroot/;
}

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

location / {
    root html;
}

(3)第三个规则

就是处理网站动态页面请求
通过匹配网页文件后缀用来转发带.php、.jsp后缀的动态请求到后端应用服务器处理

location \.php$ {
    fastcgi_pass PHP服务器地址:端口;
}

location \.jsp$ {
    proxy_pass TOMCAT服务器地址:端口;
}



location \.php$ {
    fastcgi_pass php_server:9000;
}

location \.jsp$ {
    proxy_pass http://tomcat_server;
}

二.Rewrite 地址重写

1.rewrite功能概述

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

rewrite 对用户的URL访问路径进行重写,在重定向跳转访问重写后的路径

 rewrite只能放在server{},location{},if{}中,并且默认只能对域名后边的除去传递的参数外的字符串起作用,
例如 http://www.xy101.com/abc/bbs/index.php?a=1&b=2 只对/abc/bbs/index.php重写。

2.rewrite跳转实现

Nginx:通过ngx_http_rewrite_module 模块支持URL重写、支持if条件判断,但不支持else

跳转:从一个 location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误

PCRE支持:perl兼容正则表达式的语法规则匹配

重写模块 set 指令:创建新的变量并设其值

(1)rewrite 执行顺序如下:

执行 server 块里面的 rewrite 指令。

 执行 location 匹配。

 执行选定的 location 中的 rewrite 指令。

(2)语法格式:

rewrite <regex> <replacement> [flag];

regex :表示正则匹配规则。

replacement :表示跳转后的内容。

flag :表示 rewrite 支持的 flag 标记。

(3)flag标记说明

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

3.rewrite 示例

(1)基于域名的跳转

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

配置设置

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

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

之后在本机上hosts文件内添加 域名和IP地址

192.168.80.10 www.xy101.com www.xy102.com

然后再重新启动nginx服务

systemctl restart nginx

 访问结果

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

(2)基于客户端 IP 访问跳转

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

配置设置

vim /usr/local/nginx/conf/nginx.conf
server {
	listen       80;
	server_name  www.xy101.com;		#域名修改	
	charset utf-8;
	access_log  /var/log/nginx/www.xy101.com-access.log;		#日志修改

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

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

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

相关文章

AI写作工具:提升工作效率的五大利器

不知道大家有没有发现&#xff0c;随着人工智能技术的快速发展&#xff0c;AI工具正逐渐渗透到我们日常生活的各个方面&#xff0c;极大地提高了我们的工作和学习效率。无论是AI写作、AI绘画、AI思维导图&#xff0c;还是AI幻灯片制作&#xff0c;这些工具已成为我们不可或缺的…

【计算机毕业设计】266基于微信小程序的在线点餐

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

49、Flink 的数据源的 SplitReader API 详解

SplitReader API a&#xff09;概述 核心的 SourceReader API 是完全异步的&#xff0c;但实际上&#xff0c;大多数 Sources 都会使用阻塞的操作&#xff0c;例如客户端&#xff08;如 KafkaConsumer&#xff09;的 poll() 阻塞调用&#xff0c;或者分布式文件系统&#xff…

包装机故障排查与修复方法:确保生产线的稳定运行

在现代化的工业生产中&#xff0c;包装机作为生产线上的重要一环&#xff0c;其稳定运行直接关系到产品的质量和生产效率。然而&#xff0c;包装机在使用过程中难免会遇到各种故障&#xff0c;如何快速准确地排查并修复这些故障&#xff0c;确保生产线的稳定运行&#xff0c;成…

【Echarts系列】带图片的饼图

【Echarts系列】带图片的饼图 序前提说明示例数据格式代码动态旋转图片 序 为了节省后续开发学习成本&#xff0c;这个系列将记录我工作所用到的一些echarts图表。 前提说明 因为饼图中间需要添加图片&#xff0c;所以比较特殊&#xff0c;对于饼图中间数据的对齐很容易出现…

【npm】console工具(含胶囊,表格,gif图片)

这是一款控制台花样输出工具 相对丰富的输出方式 文本输出属性值输出胶囊样式输出表格输出图片输出&#xff08;含动图&#xff09; 安装 npm install v_aot引用 import v_aot from "v_aot";字段说明 字段类型属性字符串值字符串类型default 、 primary 、 suc…

Centos用自定义java安装包替换系统java版本

一.下载自定义安装java压缩包&#xff0c;比如 jdk-8u191-linux-x64.tar.gz 二.解压到/usr/java/ 下 tar -zxvf jdk-8u191-linux-x64.tar.gz 三.执行命令 update-alternatives --install /usr/bin/java java /usr/java/jdk1.8.0_191/bin/java 300 update-alternatives --i…

【全开源】旅游系统小程序(Uniapp+FastAdmin+ThinkPHP)

&#x1f308;暑假到来&#xff0c;旅游系统小程序助你畅游无忧&#xff01;&#x1f392; 旅游系统&#xff0c;包含消费者端&#xff08;手机端&#xff09;、机构工作人员&#xff08;手机端&#xff09;、机构端&#xff08;PC&#xff09;、平台管理端&#xff08;PC&…

Python基础速成

文件操作 文件读取 with open语法 文件写入 注意事项 文件追加 异常、模块与包 捕获异常 捕获方法 捕获传递 模块的导入与自定义 定义 导入方式 自定义 测试模块 注意事项 python包 定义 操作 第三方包 定义 pip指令安装包

实现思路:Vue 子组件高度不固定下实现瀑布流布局

实现思路&#xff1a;Vue 子组件高度不固定下实现瀑布流布局 一、瀑布流布局基础实现原理 在深入解说不定高度子组件的瀑布流如何实现之前&#xff0c;先大体说一下子组件高度固定已知的这种实现原理&#xff1a; 有一个已知组件高度的数组。定义好这个瀑布流的列数&#xff…

新概念英语视频百度云,新概念英语视频百度网盘,新概念1-4册

在现今数字化时代&#xff0c;英语学习资源丰富多样&#xff0c;其中新概念英语视频因其深入浅出的教学风格和丰富多样的学习内容&#xff0c;备受广大英语学习者的青睐。本文旨在为广大英语学习者提供一份详尽的新概念英语视频下载指南&#xff0c;帮助大家轻松获取优质学习资…

Macbook M芯片Homebrew与git的安装与配置

Macbook M芯片Homebrew与git的安装与配置 Homebrew的安装与配置 搜索Homebrew; 找到如下网址https://brew.sh/ 把以上命令复制到终端 执行后&#xff0c;发现并不能下载&#xff1b; 如果你像我一样也是不通的&#xff0c;可以使用国内源,将如下命令复制到终端&#xff1a;…

【C++题解】1750 - 有0的数

问题&#xff1a;1750 - 有0的数 类型&#xff1a;简单循环 题目描述&#xff1a; 请求出 1∼n 中含有数字 0 的数&#xff0c;有多少个&#xff1f; 输入&#xff1a; 一个整数 n&#xff08;n≤999&#xff09; 。 输出&#xff1a; 一个整数&#xff0c;代表 1∼n 中含…

关于Spring Security的CORS

目录 一、CORS是什么 二、同源安全策略 三、Spring Security中CORS的开启 四、其它处理方法 一、CORS是什么 CORS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨源/域资源共享 &#xff09;是一个W3C标准&#xff0c;一种允许当前域&#xff08;domain&#xff…

苹果WWDC揭晓AI系统、电脑等设备系统全线更新,iPhone将接入ChatGPT

iOS 18可自定义主屏幕、可卫星发短信、钱包App新增点击付款Tap to Cash功能、照片App大改、支持RCS短信&#xff1b;iPad首次有原生计算器App&#xff0c;iPad结合Apple Pencil拥有数学笔记功能&#xff1b;新版macOS可通过Mac查看控制iPhone&#xff0c;Safari有AI驱动的高亮显…

Docker:安装 Orion-Visor 服务器运维的技术指南

请关注微信公众号&#xff1a;拾荒的小海螺 博客地址&#xff1a;http://lsk-ww.cn/ 1、简述 Orion-Visor 是一种用于管理和监控容器的工具。它提供了一个直观的界面&#xff0c;用于查看容器的状态、资源使用情况以及日志等信息。在这篇技术博客中&#xff0c;我们将介绍如何…

01.FastLED库基础

FastLED库基础 FastLED库HSV颜色 HSV颜色基本概念 HSV颜色简介 HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色表达方法。该方法中的三个参数分别是&#xff1a;色调&#xff08;H&#xff09;&#xff0c;饱和度&#xff08;S&#…

Jenkins三种构建类型

目录 传送门前言一、概念二、前置处理&#xff08;必做&#xff09;1、赋予777权限2、让jenkins用户拥有root用户的kill权限3、要运行jar包端口号需要大于1024 三、自由风格软件项目&#xff08;FreeStyle Project&#xff09;&#xff08;推荐&#xff09;三、Maven项目&#…

最全面又最浅显易懂的Langchain快速上手教程(下)

最全面又最浅显易懂的Langchain快速上手教程&#xff08;下&#xff09; 三. 深入Langchain 1. 架构设计 从上文知道Langchain在架构上使用了从抽象、到具体、再到整合适配的三层架构&#xff0c;这种一层一层逐渐具体的设计最大可能性的保证了架构的可扩展性和维护性。同时…

【Python】 探索 Python 中的 Ellipsis 对象:一个神奇的省略号

基本原理 在 Python 中&#xff0c;Ellipsis 对象是一个特殊的内置对象&#xff0c;它通常用三个连续的点 ... 来表示。这个对象在 Python 中有几个特定的用途&#xff0c;尤其是在切片操作和迭代器表达式中。虽然它看起来像是一个普通的省略号&#xff0c;但它实际上是 Pytho…