Nginx 之Rewrite 使用详解
文章目录
-
- 1. 概述
- 2. Rewrite 指令
-
- 2.1 指令语法
- 2.2 Flag 标记说明
- 3. Rewrite 与 Location
-
- 3.1 Location 分类
- 3.2 Rewrite 和 Location 比较
- 4. Rewrite 实际场景
-
- 4.1 基于域名的跳转
- 4.2 基于客户端 IP 访问跳转
- 4.3 基于参数匹配的跳转
- 4.4 基于目录下所有 PHP 文件跳转
- 4.5 基于最普通 URL 请求的跳转
- 5. Rewrite 执行顺序
- 6. Rewrite 与 If 指令
- 7. Rewrite 正则表达式
- 8. Rewrite 指令的脚本指令
- 9. Rewrite 配置示例
-
- 9.1 301/302 重定向
- 9.2 非 www 域名重定向到 www 域名
- 9.3 URL 正则重写:简化 URL 结构
- 10. 结论
1. 概述
Nginx 的 rewrite 模块是处理 HTTP 请求过程中的一个重要功能,它允许基于 Perl 兼容正则表达式(PCRE)对用户请求的 URI 进行重写,并返回 30x 重定向跳转或按条件执行相关配置。这个模块提供了灵活的 URL 重写和重定向功能,可以用于实现友好 URL、301/302 重定向、条件重写等。
2. Rewrite 指令
2.1 指令语法
Nginx 中的 URL 重写主要依赖于 rewrite 指令,其基本语法如下:
rewrite <regex> <replacement> [flag];
-
regex:用于匹配 URI 的正则表达式。
-
replacement:将匹配到的 URI 替换成的新 URI。
-
flag(可选):控制重写的行为,常见的标志有:
last:表示重新搜索新的 location 块(即继续匹配新的规则)。break:停止当前 location 块中的规则匹配,执行后续指令。redirect:执行临时 重定向(302)。permanent:执行永久重定向(301)。
2.2 Flag 标记说明
last:重写请求并继续搜索 location 匹配。break:重写请求并停止搜索 location 匹配。redirect:返回 302 临时重定向。permanent:返回 301 永久重定向。
3. Rewrite 与 Location
rewrite 指令可以在 server 或 location 块中配置。location 块只对域名后除去传递参数的字符串起作用,而 rewrite 可以对域名或参数字符串进行匹配和重写。
3.1 Location 分类
- 普通 location:匹配特定路径。
- 正则 location:使用正则表达式匹配路径。
- 优先级:Nginx 会优先匹配带有正则表达式的 location,然后是最长非正则 location。
3.2 Rewrite 和 Location 比较
rewrite用于重写请求 URI。location用于定义请求的处理方式。
4. Rewrite 实际场景
4.1 基于域名的跳转
将旧域名的访问重定向到新域名,同时保持参数不变。
# 定义一个 server 块,用于处理进来的 HTTP 请求
server {# 监听 80 端口,即 HTTP 默认端口listen 80;# 指定该 server 块响应的域名,这里是 olddomain.comserver_name olddomain.com;# 定义 location 块,匹配所有 URI(/ 表示根路径)location / {# 使用 rewrite 指令将所有请求从 olddomain.com 重定向到 newdomain.com# 并保持原有的请求路径和查询参数不变rewrite ^/(.*)$ http://newdomain.com/$1 permanent;}
}
这段配置的作用是将所有访问 olddomain.com 的请求通过 Nginx 重定向到 newdomain.com,并且保持请求的路径不变。permanent 标志表示这是一个永久重定向(301 状态码),告诉搜索引擎和浏览器该资源已经被永久移动到新的位置。
4.2 基于客户端 IP 访问跳转
只允许特定 IP 访问,其他 IP 重定向到维护页面。
# 定义一个 server 块,用于处理进来的 HTTP 请求
server {# 监听 80 端口,即 HTTP 默认端口listen 80;# 指定该 server 块响应的域名,这里是 example.comserver_name example.com;# 定义 location 块,匹配所有 URI(/ 表示根路径)location / {# 使用 if 指令进行条件判断,$remote_addr 是客户端的 IP 地址if ($remote_addr != '192.168.1.100') {# 如果客户端 IP 地址不是 '192.168.1.100',则返回 302 状态码# 并将请求重定向到 /maintenance.html,表示网站正在维护中return 302 /maintenance.html;}}
}
这段配置的作用是限制对 example.com 的访问,只允许 IP 地址为 192.168.1.100 的客户端访问所有资源,其他所有 IP 地址的访问都会被重定向到 /maintenance.html 页面,通常用于网站维护期间。这里使用的是临时重定向(302 状态码),意味着浏览器会显示新的 URL(即 /maintenance.html),但搜索引擎和缓存可能会保留原始请求的 URL。
4.3 基于参数匹配的跳转
根据请求参数进行跳转。
# 定义一个 server 块,用于处理进来的 HTTP 请求
server {# 监听 80 端口,即 HTTP 默认端口listen 80;# 指定该 server 块响应的域名,这里是 example.comserver_name example.com;# 定义 location 块,匹配所有 URI(/ 表示根路径)location / {# 使用 rewrite 指令进行 URL 重写# 正则表达式 ^/(.*)?param=value$ 匹配任何以 / 开头,后面跟着任意字符# 并且以 ?param=value 结尾的请求 URIrewrite ^/(.*)?param=value$ /new-path/$1 last;# last 标志表示重写完成后,继续搜索匹配的 location 块# 这里的 $1 是正则表达式中括号内匹配到的部分,即任意字符的部分}
}
这段配置的作用是将所有匹配特定模式的请求重写到一个新的路径。具体来说,它会查找所有以 / 开头,后面跟着任意内容,并且以 ?param=value 结尾的请求,并将这些请求重写到 /new-path/ 开头的路径下,同时保留原始请求中的路径部分(不包括查询参数)。last 标志意味着在重写后,Nginx 将继续检查其他 location 块以找到最合适的匹配项。
4.4 基于目录下所有 PHP 文件跳转
将特定目录下的所有 PHP 文件请求重写到新路径。
# 定义一个 server 块,用于处理进来的 HTTP 请求
server {# 监听 80 端口,即 HTTP 默认端口listen 80;# 指定该 server 块响应的域名,这里是 example.comserver_name example.com;# 定义一个 location 块,使用 ~ 表示这是一个正则表达式匹配# 正则表达式 .php$ 匹配以 .php 结尾的请求 URIlocation ~ .php$ {# 使用 rewrite 指令进行 URL 重写# 正则表达式 ^/(.*).php$ 匹配任何以 / 开头,后面跟着任意字符,以 .php 结尾的请求 URIrewrite ^/(.*).php$ /new-path/$1.php last;# last 标志表示重写完成后,继续搜索匹配的 location 块# 这里的 $1 是正则表达式中括号内匹配到的部分,即除去 .php 后缀的文件名部分}
}
这段配置的作用是将所有请求 URI 以 .php 结尾的请求重写到 /new-path/ 下的相同文件名。例如,请求 /example.com/about.php 会被重写为 /example.com/new-path/about.php。last 标志意味着在重写后,Nginx 将继续检查其他 location 块以找到最合适的匹配项,而不是立即停止处理当前 location 块。
4.5 基于最普通 URL 请求的跳转
将普通 URL 请求重写到新路径。
# 定义一个 server 块,用于处理进来的 HTTP 请求
server {# 监听 80 端口,即 HTTP 默认端口listen 80;# 指定该 server 块响应的域名,这里是 example.comserver_name example.com;# 定义 location 块,匹配所有 URI(/ 表示根路径)location / {# 使用 rewrite 指令进行 URL 重写# 正则表达式 ^/(.*)$ 匹配任何以 / 开头,后面跟着任意字符的请求 URIrewrite ^/(.*)$ /new-path/$1 permanent;# permanent 标志表示这是一个永久重定向(301 状态码)# 告诉浏览器和搜索引擎该资源已经被永久移动到新的位置# $1 是正则表达式中括号内匹配到的部分,即除去第一个斜杠后的整个请求路径}
}
这段配置的作用是将所有访问 example.com 的请求重定向到 /new-path/ 下的相同路径。例如,请求 /example.com/about 会被永久重定向到 /example.com/new-path/about。permanent 标志意味着这是一个永久重定向,浏览器会更新收藏夹中的 URL,搜索引擎也会更新其索引。
5. Rewrite 执行顺序
rewrite 指令的执行顺序如下:
- 执行
server块里面的rewrite指令。 - 执行
location匹配。 - 执行选定
location中的rewrite指令。
6. Rewrite 与 If 指令
if 指令用于条件判断,可以与 rewrite 结合使用,但需要注意 if 是邪恶的,因为它可能导致 Nginx 配置变得复杂和难以维护。推荐使用 rewrite 来实现条件重写。
7. Rewrite 正则表达式
Nginx 的 rewrite 模块支持 PCRE 正则表达式,以下是一些常用的正则表达式元字符:
.:匹配任意单个字符。^:匹配字符串的开始。$:匹配字符串的结束。*:匹配前面的元素 0 次或多次。+:匹配前面的元素 1 次或多次。?:匹配前面的元素 0 次或 1 次。[]:匹配括号内的任意一个字符。|:逻辑或操作符。
8. Rewrite 指令的脚本指令
rewrite 模块提供了类似脚本语言的指令,可以在 HTTP 请求处理过程中对 URI 进行更灵活的操作控制。
9. Rewrite 配置示例
以下是一些 rewrite 配置的示例:
9.1 301/302 重定向
# 定义一个 server 块,用于处理 HTTP 请求
server {# 监听 80 端口,这是 HTTP 协议的默认端口listen 80;# 指定 server 块服务的域名,这里是 olddomain.comserver_name olddomain.com;# 定义 location 块,用于匹配所有请求的 URI(/ 表示根路径)location / {# 使用 rewrite 指令进行 URL 重写# 正则表达式 ^/(.*)$ 匹配所有以 / 开头的请求 URIrewrite ^/(.*)$ http://newdomain.com/$1 permanent;# 将匹配到的请求重写到 newdomain.com 的相同路径# $1 表示正则表达式中括号内匹配到的部分,即除了根斜杠外的路径部分# permanent 标志表示这是一个永久重定向(301 状态码)# 告诉浏览器和搜索引擎该资源已经被永久移动到新域名}
}
这段配置的作用是将所有访问 olddomain.com 的请求永久重定向到 newdomain.com 的相同路径。例如,如果用户访问 olddomain.com/about,他们将被重定向到 newdomain.com/about。这个重定向是永久的,意味着搜索引擎和浏览器会更新相应的链接,并且用户浏览器的地址栏也会显示新的 URL。
9.2 非 www 域名重定向到 www 域名
# 第一个 server 块,用于处理对 example.com 的非 www 前缀域名的请求
server {# 监听 80 端口,这是 HTTP 协议的默认端口listen 80;# 指定 server 块服务的域名,这里是 example.com(没有 www 前缀)server_name example.com;# 对于所有请求,返回一个 301 永久重定向响应# 这会将用户从 http://example.com 重定向到 http://www.example.com,并保留原始请求的 URIreturn 301 http://www.example.com$request_uri;
}# 第二个 server 块,用于处理对 www.example.com 的请求
server {# 监听 80 端口,这是 HTTP 协议的默认端口listen 80;# 指定 server 块服务的域名,这里是 www.example.com(带有 www 前缀)server_name www.example.com;# 定义 location 块,用于匹配所有请求的 URI(/ 表示根路径)location / {# 这里可以放置处理 www.example.com 域名请求的配置# 例如,可以配置 proxy_pass 来代理请求,或者 root 指令来指定文件根目录等# 正常站点配置}
}
这段配置的作用是将所有对 example.com(没有 www 前缀)的 HTTP 请求永久重定向到 www.example.com(带有 www 前缀)。第一个 server 块监听 example.com 并返回一个 301 状态码,将请求重定向到 www.example.com,同时保留请求的 URI。第二个 server 块则处理对 www.example.com 的请求,可以在这里进行进一步的配置,比如设置代理、静态文件服务等。
关于您提到的网址 http://www.example.com$request_uri,由于网络原因,解析并没有成功。这可能是由于链接格式不正确或者网络连接问题。请检查网页链接的合法性,并在确保网络连接正常的情况下适当重试。如果问题依旧存在,可能需要进一步的网络诊断或联系网站管理员。如果您有其他问题或需要帮助,请随时告知。
9.3 URL 正则重写:简化 URL 结构
# 定义一个 server 块,用于处理进来的 HTTP 请求
server {# 监听 80 端口,即 HTTP 默认端口listen 80;# 指定该 server 块响应的域名,这里是 example.comserver_name example.com;# 定义一个 location 块,匹配请求 URI 路径以 /category/id/ 开头的请求location /category/id/ {# 使用 rewrite 指令进行 URL 重写# 正则表达式 ^/category/id/(d+)$ 匹配以 /category/id/ 开头,接着是数字的请求 URIrewrite ^/category/id/(d+)$ /category/$1 last;# last 标志表示重写完成后,继续搜索匹配的 location 块# $1 是正则表达式中括号内匹配到的部分,即 URI 中的数字部分}
}
这段配置的作用是将所有匹配 /category/id/ 路径并且后面跟着数字的请求重写到 /category/ 路径下。例如,请求 /category/id/123 会被重写为 /category/123。last 标志意味着在重写后,Nginx 将继续检查其他 location 块以找到最合适的匹配项。这样做可以允许 Nginx 在重写请求后,根据新的 URI 再次检查是否有更具体的 location 匹配,从而应用更具体的配置。
10. 结论
Nginx 的 rewrite 模块提供了强大的 URL 重写和重定向功能,可以用于实现各种复杂的 URL 处理需求。通过合理配置 rewrite 指令,可以提高网站的可用性、改善 SEO、实现域名迁移等。本手册详细介绍了 rewrite 的命令、语法、含义、环境和示例,希望能够帮助用户更好地理解和使用 Nginx 的 rewrite 功能。
相关文章:
Nginx 之Rewrite 使用详解
文章目录 1. 概述2. Rewrite 指令 2.1 指令语法2.2 Flag 标记说明 3. Rewrite 与 Location 3.1 Location 分类3.2 Rewrite 和 Location 比较 4. Rewrite 实际场景 4.1 基于域名的跳转4.2 基于客户端 IP 访问跳转4.3 基于参数匹配的跳转4.4 基于目录下所有 PHP 文件跳转4.5 基于…...
注册Gmail如何跳过手机验证环节?
很多小伙伴在注册Gmail的时候都会遇到一个难题:手机号码验证,有可能包括了“手机号无法验证” “国内手机号验证失败” “收不到验证码”等等问题,但 根据真实案例,还有部分人则是“幸运地”没有手机号验证环节,那么今…...
WordPress自助建站全攻略
一、基础概念与核心优势 WordPress自助建站是一种无需编程即可搭建网站的平台,基于开源CMS系统,支持高度定制化。其核心优势主要体现在: 易用性:拖拽式编辑器和直观的后台操作,适合零基础用户快速上手。低成本&#x…...
TreeSet(单列集合)
TreeSet 是 Java 集合框架中的一种实现了 Set 接口的类,它通过一个红黑树(Red-Black Tree)来存储元素。由于使用了树结构,TreeSet 保证了元素的有序性,并且不允许重复元素。 1. TreeSet 的基本特性 有序性࿱…...
Elasticsearch:同义词在 RAG 中重要吗?
作者:来自 Elastic Jeffrey Rengifo 及 Toms Mura 探索 RAG 应用程序中 Elasticsearch 同义词的功能。 同义词允许我们使用具有相同含义的不同词语在文档中搜索,以确保用户无论使用什么确切的词语都能找到他们所寻找的内容。你可能会认为,由于…...
Docker安装分布式vLLM
Docker安装分布式vLLM 1 介绍 vLLM是一个快速且易于使用的LLM推理和服务库,适合用于生产环境。单主机部署会遇到显存不足的问题,因此需要分布式部署。 分布式安装方法 https://docs.vllm.ai/en/latest/serving/distributed_serving.html2 安装方法 …...
可视化实操记录(自用)
流程 读取数据 original_data pd.read_csv(“Penguins.csv”) original_data.head() 评估和清理数据 cleaned_data original_data.copy() #备份 结构 original_data.sample(5) 数据符合“每个变量为一列,每个观察值为一行,每种类型的观察单位为一…...
二叉树的遍历方式和子问题思路
目录 二叉树的遍历: 前序遍历: 中序遍历: 后序遍历: 二叉树的基本操作: 求树的结点个数(递归遍历思路): 求树的结点个数(子问题思路): 求树的…...
运用Deek Seeker协助数据分析
我的数据源有两张表,一个是每日销售表(字段有日期、产品名称、实际销量),一个是每月目标表(字段有年度月份、产品名称、目标销量);我的需求是,按月、按年来统计每个产品的目标完成情况请问用PowerBl进行分析,应该如何建立数据模型…...
服务器之连接简介(Detailed Explanation of Server Connection)
一台服务器最大能支持多少连接?一台客户端机器最多能发起多少条连接?? 我们知道TCP连接,从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】(这里也对应着TCP四元组:源IP、源端口、…...
低空经济:开启未来空中生活的全新蓝海
引言 随着科技的进步,我们不再仅仅依赖地面交通和传统物流。你是否曾幻想过,未来的某一天,快递、外卖可以像魔法一样直接从空中送到你手中?或者,你能乘坐小型飞行器,快速穿梭于城市之间,告别拥堵…...
主动视觉可能就是你所需要的:在双臂机器人操作中探索主动视觉
AV-ALOHA 系统使用用于 AV 的 VR 耳机实现直观的数据收集,并且 用于作的 VR 控制器或引线臂。这有助于捕捉全身和头部 远程作我们的真实和模拟系统的运动,记录来自 6 个的视频 不同的摄像头,并为我们的 AV 仿制学习策略提供训练数据。 加州大…...
洛谷 P6419 COCI2014/2015 #1 Kamp 题解
题意 一颗树 n n n 个点, n − 1 n-1 n−1 条边,经过每条边都要花费一定的时间,任意两个点都是联通的。 有 k k k 个人(分布在 k k k 个不同的点)要集中到一个点举行聚会。 聚会结束后需要一辆车从举行聚会的这点…...
在 Vue 项目中使用 SQLite 数据库的基础应用
目录 一、环境准备二、数据库连接与操作1. 创建数据库连接2. 创建表3. 插入数据4. 查询数据5. 更新数据6. 删除数据 三、在 Vue 组件中使用 SQLite 一、环境准备 安装 Node.js 和 npm:确保已安装 Node.js 和 npm。 创建 Vue 项目:使用 Vue CLI 创建一个…...
AI会话问答的页面滚动处理(参考deepseek页面效果)
近期在接入deepseekR1的深度思考,研究了下deepseek官网的滚动效果,大概如下:用户发出消息后,自动滚动到页面最底部,让最新消息展示在视野中,这时候,我们先处理一次滚动: const scrol…...
GRN前沿:DGCGRN:基于有向图卷积网络的基因调控网络推理
1.论文原名:Inference of gene regulatory networks based on directed graph convolutional networks 2.发表日期:2024 DGCGRN框架 中心节点和节点的构建 局部增强策略 1. 问题背景 在基因调控网络中,许多节点的连接度较低(即…...
MongoDB 入门操作指南
文章目录 MongoDB 入门操作指南1. 连接到 MongoDB 数据库2. 查看当前数据库3. 显示所有数据库4. 切换或创建数据库5. 查看当前数据库中的所有集合6. 创建集合7. 插入文档插入单个文档插入多个文档 8. 查询文档查询所有文档查询匹配条件的文档格式化查询输出 9. 更新文档更新单个…...
共享设备管理难?MDM助力Kiosk模式一键部署
目录 1. 简化设备部署与配置:实现一键式部署 2. 自动化应用更新与内容推送:确保设备始终保持最新状态 3. 权限控制与设备安全:防止滥用与数据泄露 4. 远程管理与故障诊断:保障设备长期稳定运行 5. 数据分析与报告:…...
HttpClient-Java程序中发送Http请求
配置 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> </dependency> ps:aliyun-sdk-oss中已引入上述配置 HttpClient的核心API: Htt…...
硬件-电源-隔离与非隔离的区别
文章目录 一:隔离电源与非隔离电源1.1 充电器触电新闻1.2 电路拓扑1.3 隔离电源与非隔离电源的优缺点1.3 隔离电源与非隔离电源的选择1.3.1 隔离电源1.3.2 非隔离电源 二:注意事项2.1 隔离电源结构图2.1 隔离耐压测试方法 三:感悟道友&#x…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
前端开发者常用网站
Can I use网站:一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use:Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站:MDN JavaScript权威网站:JavaScript | MDN...
从零手写Java版本的LSM Tree (一):LSM Tree 概述
🔥 推荐一个高质量的Java LSM Tree开源项目! https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一个从零实现的Log-Structured Merge Tree,专为高并发写入场景设计。 核心亮点: ⚡ 极致性能:写入速度超…...
