Location匹配与Rewrite重写
一、常见的Nginx正则表达式
^ :匹配输入字符串的起始位置
$ :匹配输入字符串的结束位置
* :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”
+ :匹配前面的字符一次或多次。如“ol+”能匹配“ol”及“oll”、“olll”,但不能匹配“o”
? :匹配前面的字符零次或一次,例如“do(es)?”能匹配“do”或者“does”,”?”等效于”{0,1}”
. :匹配除“\n”之外的任何单个字符,若要匹配包括“\n”在内的任意字符,请使用诸如“[.\n]”之类的模式
\ :将后面接着的字符标记为一个特殊字符或一个原义字符或一个向后引用。如“\n”匹配一个换行符,而“\$”则匹配“$”
\d :匹配纯数字[0-9] \s:空白符 \w:任意单词字符包括下划线[a-zA-Z0-9_]
[list] :匹配list列表中的一个字符,例: go[ola]d, [abc]、 [a-z]、 [a-z0-9]、 [0-9]匹配任意一位数字
[^list] :匹配任意非list列表中的一个字符,例: [^0-9]、 [^A-20-9]、 [^a-z]匹配任意一位非小写字母
{n} :重复 n 次
{n,} :重复 n 次或更多次
{n,m} :重复 n 到 m 次
[] :定义匹配的字符范围
[c] :匹配单个字符 c
[a-z] :匹配 a-z 小写字母的任意一个
[a-zA-Z0-9] :匹配所有大小写字母或数字
() :表达式的开始和结束位置
| :或运算符
二、Location匹配
1.location大致可以分为三类:
精准匹配:location = / {}
一般匹配:location / {}
正则匹配:location ~ / {}
2.location常用的匹配规则:
= :进行普通字符精确匹配,也就是完全匹配。
^~ :表示普通字符匹配。使用前缀匹配。如果匹配成功,则不再匹配其它 location。
~ :区分大小写的匹配。
~* :不区分大小写的匹配。
!~ :区分大小写的匹配取非。
!~* :不区分大小写的匹配取非。
3.location 优先级
首先精确匹配 =
其次前缀匹配 ^~
其次是按文件中顺序的正则匹配 ~或~*
然后匹配不带任何修饰的前缀匹配(一般匹配)
最后是交给 / 通用匹配
优先级总结:
1.(location = 完整路径)>(location ^~路径)>(location ~,~* 正则顺序)>(location 部分起始部分)>(location /)
2.优先级相同,正则看上下顺序,上面的优先;一般匹配看长度,最长匹配优先
4.location 示例说明
(1)location = / {}
=为精确匹配 / ,主机名后面不能带任何字符串,比如访问 / 和 /data,则 / 匹配,/data 不匹配
再比如 location = /abc,则只匹配/abc ,/abc/或 /abcd不匹配。若 location /abc,则即匹配/abc 、/abcd/ 同时也匹配 /abc/。
(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 文件,如果和正则 ~ /images/abc/1.html 相比,正则优先级更高
优先级总结:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (location /)
实际网站使用中,至少有三个匹配规则定义
第一个必选规则
直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,比如说官网 这里是直接转发给后端应用服务器了,也可以是一个静态首页
location ^~ /static/ {root /webroot/static/;
}location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {root /webroot/res/;
}
第二个必选规则
处理静态文件请求,这是nginx作为http服务器的强项 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {root /webroot/static/;
}location ~* \.(html|gif|jpg|jpeg|png|css|js|ico)$ {root /webroot/res/;
}
第三个规则
通用规则,比如用来转发带.php、.jsp后缀的动态请求到后端应用服务器 非静态文件请求就默认是动态请求
location / {proxy_pass http://tomcat_server;
}
三、rewrite
rewrite功能就是使用nginx提供的全局变量或自己设置的变量,结合正则表达式和标记实现URL重写以及重定向。
例如:更换域名后需要保持旧的域名能够转到新的域名上、某网页发生改变需要跳转到新的页面、网站防盗链等等需求。
注意:rewrite只能放在server{},location{},if{}中,并且默认只能对域名后面的除去传递的参数外的字符串起作用。
rewrite 跳转实现
Nginx:通过ngx_http_rewrite_module模块支持URL重写、支持if条件判断,但不支持else
跳转:从一个location跳转到另一个location,循环最多可以执行10次,超过后nginx将返回500错误
PCRE支持:perl兼容正则表达式的语法规则匹配
重写模块set指令:创建新的变量并为其赋值
rewrite执行顺序
1.执行server块里面的rewrite指令
2.执行location匹配
3.执行选定的location中的rewrite指令
rewrite语法格式
语法rewrite<regex><replacement><flag>;
regex : 表示正则匹配规则
replacement : 表示跳转后的内容
flag : 表示rewrite支持的flag标记
flag标记说明
last : 本条规则匹配完成后,继续向下匹配新的location URI规则,一般用在 server 和 if 中。
break : 本条规则匹配完成即终止,不再匹配后面的任何规则,一般使用在 location 中。
redirect : 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
permanent : 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
rewrite 示例
1)基于域名的跳转
现在公司旧域名www.test.com有业务需求变更,需要使用新域名www.lisi.com代替,但是旧域名不能废除,需要跳转到新域名上,而且后面的参数保持不变。
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name www.test.com; #域名修改 charset utf-8;access_log /var/log/nginx/www.test.com.access.log; #日志修改location / { if ($host = 'www.test.com'){ #$host为rewrite全局变量,代表请求主机头字段或主机名rewrite ^/(.*)$ http://www.lisi.com/$1 permanent; #$1为正则匹配的内容,即域名后边的字符串}root html;index index.html index.htm;}
}echo "192.168.50.26 www.lisi.com www.test.com" >> /etc/hosts
systemctl restart nginx
2)基于客户端 IP 访问跳转
今天公司业务新版本上线,要求所有 IP 访问任何内容都显示一个固定维护页面,只有公司 IP:192.168.50.26访问正常
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name www.test.com;charset utf-8;access_log /var/log/nginx/www.test.com.access.log;#设置是否合法的IP标记;设置变量$rewrite,变量值为boole值trueset $rewrite true;#判断是否为合法IP;当客户端IP为192.168.50.26时,将变量值设为false,不进行重写if ($remote_addr = "192.168.50.26"){set $rewrite false;}#除了合法IP,其它都是非法IP,进行重写跳转维护页面#当变量值为true时,进行重写if ($rewrite = true){#重写在访问IP后边插入/weihu.html,例如192.168.50.11/weihu.htmlrewrite (.+) /weihu.html;}location = /weihu.html {#网页返回/var/www/html/weihu.html的内容root /var/www/html;}location / {root html;index index.html index.htm;}
}mkdir -p /var/www/html/
echo "As server maintenance, please visit later, thank you." > /var/www/html/weihu.html
echo "192.168.50.26 www.test.com" >> /etc/hosts
systemctl restart nginx
3)基于旧域名跳转到新域名后面加目录
现在访问的是 http://lisi.test.com,现在需要将这个域名下面的访问都跳转到http://www.test.com/lisi
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name lisi.test.com;charset utf-8;access_log /var/log/nginx/lisi.test.com.access.log;#添加;这里的$1为位置变量,代表/postlocation /post {rewrite (.+) http://www.test.com/lisi$1 permanent;}location / {root html;index index.html index.htm;}
}mkdir -p /usr/local/nginx/html/lisi/post
echo "this is 1.html" > /usr/local/nginx/html/lisi/post/1.html
echo "192.168.50.26 lisi.test.com www.test.com" >> /etc/hosts
systemctl restart nginx.service
使用浏览器访问
http://lisi.test.com/post/1.html 跳转到 http://www.test.com/lisi/post/1.html
4)基于参数匹配的跳转
现在访问http://www.test.com/100-(100|200)-100(任意数字).html 跳转到http://www.test.com页面
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name www.test.com;charset utf-8;access_log /var/log/nginx/www.test.com.access.log;if ($request_uri ~ ^/100-(100|200)-(\d+).html$) {rewrite (.+) http://www.test.com permanent;}location / {root html;index index.html index.htm;}
}echo "192.168.50.26 www.test.com" >> /etc/hosts
systemctl restart nginx浏览器访问
http://www.test.com/100-200-100.html 或
http://www.test.com/100-100-100.html 跳转到http://www.test.com页面。
5)基于目录下所有 php 结尾的文件跳转
要求访问 http://www.test.com/upload/123.php 跳转到首页。
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name www.test.com;charset utf-8;access_log /var/log/nginx/www.test.com.access.log;location ~* /upload/.*\.php$ {rewrite (.+) http://www.test.com permanent;
}location / {root html;index index.html index.htm;
}
}echo "192.168.50.26 www.test.com" >> /etc/hosts
systemctl restart nginx浏览器访问
http://www.test.com/upload/abc.php 跳转到http://www.test.com页面。
相关文章:
Location匹配与Rewrite重写
一、常见的Nginx正则表达式 ^ :匹配输入字符串的起始位置 $ :匹配输入字符串的结束位置 * :匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”:匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“oll…...
Docker源码阅读 - goland环境准备
docker 源码分为两部分 cli 和 moby(docker) tips: docker是从moby拷贝过去的;docker整体是一个C-S架构,cli客户端,docker服务端 docker-ce:https://github.com/docker/docker-ce cli:https://…...
数据库信息速递 -- MariaDB 裁员后,前景不确定 (翻译)
开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请加 liuaustin3微信号 ,在新加的朋友会分到3群ÿ…...
4.1 Windows终端安全
数据参考:CISP官方 目录 安全安装保护账户安全本地安全策略安全中心系统服务安全其他安全设置软件安全获取 一、安全安装(以安装windows系统为例) 选择合适的版本 商业版本:家庭版、专业版、专业工作站版、企业版特殊版本&…...
win10强制卸载奇安信天擎
1、win r 打开运行 2、输入msconfig进入系统配置面板 3、点击引导,修改安全引导配置项 4、重启系统(桌面会变成纯黑背景,符合预期,莫紧张) 5、删除安装的文件夹 若是安装天擎时选择的自定义安装,则配置…...
npm常用命令
npm -v:查看 npm 版本 npm init:初始化后会出现一个 Package.json 配置文件,可以在后面加上 -y,快速跳到问答界面 npm install:会根据项目中的 package.json 文件自动给下载项目中所需的全部依赖 npm insall 包含 -…...
(一)创建型设计模式:4、原型模式(Prototype Pattern)
目录 1、原型模式的含义 2、C实现原型模式的简单实例 1、原型模式的含义 通过复制现有对象来创建新对象,而无需依赖于显式的构造函数或工厂方法,同时又能保证性能。 The prototype pattern is a creational design pattern in software development. …...
【算法学习】高级班九
这种互为旋变串: 给定两个字符串,判断是否互为旋变串 代码: 打表法: 每一层内的数字不互相依赖,只依赖它下面的层但实际上size会约束L1和L2的值,即L1和L2<N-size 思路:设置一个窗口…...
数据安全加固:深入解析滴滴ES安全认证技术方案
前文分别介绍了滴滴自研的ES强一致性多活是如何实现的、以及如何提升ES的性能潜力。由于ES具有强大的搜索和分析功能,同时也因其开源和易于使用而成为黑客攻击的目标。近些年,业界ES数据泄露事件频发, 以下是一些比较严重的数据泄露案件: 202…...
Typescript第九/十章 前后端框架,命名空间和模块
第九章 前后端框架 9.1 前端框架 Typescript特别适合用于开发前端应用。Typescript对JSX有很好的支持,而且能安全地建模不可变性,从而提升应用的结构和安全性,写出的代码正确性高,便于维护。 9.1.1 React JSX/TSX内容等 详情…...
LLM - argparse 解析脚本参数
目录 一.引言 二.argparse 解析 shell 参数 1.使用步骤 2.python 侧示例 3.shell 侧示例 一.引言 CUDA_VISIBLE_DEVICES0 python src/train_bash.py \--stage pt \--model_name_or_path path_to_your_model \--do_train \--dataset wiki_demo \--template default \--fin…...
谈一谈在两个商业项目中使用MVI架构后的感悟
作者:leobertlan 前言 当时项目采用MVP分层设计,组员的代码风格差异也较大,代码中类职责赋予与封装风格各成一套,随着业务急速膨胀,代码越发混乱。试图用 MVI架构 单向流 形成 掣肘 带来一致风格。 但这种做法不够以…...
ApacheCon - 云原生大数据上的 Apache 项目实践
Apache 软件基金会的官方全球系列大会 CommunityOverCode Asia(原 ApacheCon Asia)首次中国线下峰会将于 2023 年 8 月 18-20 日在北京丽亭华苑酒店举办,大会含 17 个论坛方向、上百个前沿议题。 字节跳动云原生计算团队在此次 CommunityOve…...
Git 代码分支规范
目的 俗话说:没有规矩,不成方圆。遵循一个好的规章制度能让你的工作事半功倍。同时也可以展现出你做事的认真的态度以及你的专业性,不会显得杂乱无章,管理困难。Git分支规范也是一样。当遵循了某种约定的Git分支,在代…...
ATFX汇评:美7月通胀率数据基本符合预期,美指仍无法站稳103关口
ATFX汇评:据美劳工部,美国7月未季调CPI年率,最新值3.2,高于前值3%,低于预期值3.3%,这标志着连续12个月的下降已经停止;7月未季调核心CPI年率,最新值4.7%,低于前值4.8%&am…...
系统架构设计专业技能 · 软件工程(一)【系统架构设计师】
系列文章目录 系统架构设计高级技能 软件架构概念、架构风格、ABSD、架构复用、DSSA(一)【系统架构设计师】 系统架构设计高级技能 系统质量属性与架构评估(二)【系统架构设计师】 系统架构设计高级技能 软件可靠性分析与设计…...
C语言 指针的运算
目录 一、介绍 二、指针 整数 、指针 - 整数 二、指针 - 指针 四、指针的关系运算 一、介绍 在C语言中,指针的运算分为三类 1、指针 整数 、指针 - 整数2、指针 - 指针3、指针的关系运算 二、指针 整数 、指针 - 整数 因为数组在…...
【JAVA基础】- 同步非阻塞模式NIO详解
【JAVA基础】- 同步非阻塞模式NIO详解 文章目录 【JAVA基础】- 同步非阻塞模式NIO详解一、概述二、常用概念三、NIO的实现原理四、NIO代码实现客户端实现服务端实现 五、同步非阻塞NIO总结 一、概述 NIO(Non-Blocking IO)是同步非阻塞方式来处理IO数据。…...
dingding机器人
“自定义机器人”只支持消息发送,自动回复需要“企业内部机器人” 消息发送 import requests import jsonres requests.post(https://oapi.dingtalk.com/robot/send?access_token036a339axxx,data json.dumps({"text": {"content":"h…...
6.6 实现卷积神经网络LeNet训练并预测手写体数字
模型架构 代码实现 import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(nn.Conv2d(1,6,kernel_size5,padding2),nn.Sigmoid(),#padding2补偿5x5卷积核导致的特征减少。nn.AvgPool2d(kernel_size2,stride2),nn.Conv2d(6,16,kernel_size5),nn.S…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
