当前位置: 首页 > news >正文

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 指令可以在 serverlocation 块中配置。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.phplast 标志意味着在重写后,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/aboutpermanent 标志意味着这是一个永久重定向,浏览器会更新收藏夹中的 URL,搜索引擎也会更新其索引。

5. Rewrite 执行顺序

rewrite 指令的执行顺序如下:

  1. 执行 server 块里面的 rewrite 指令。
  2. 执行 location 匹配。
  3. 执行选定 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/123last 标志意味着在重写后,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的时候都会遇到一个难题&#xff1a;手机号码验证&#xff0c;有可能包括了“手机号无法验证” “国内手机号验证失败” “收不到验证码”等等问题&#xff0c;但 根据真实案例&#xff0c;还有部分人则是“幸运地”没有手机号验证环节&#xff0c;那么今…...

WordPress自助建站全攻略

一、基础概念与核心优势 WordPress自助建站是一种无需编程即可搭建网站的平台&#xff0c;基于开源CMS系统&#xff0c;支持高度定制化。其核心优势主要体现在&#xff1a; 易用性&#xff1a;拖拽式编辑器和直观的后台操作&#xff0c;适合零基础用户快速上手。低成本&#x…...

TreeSet(单列集合)

TreeSet 是 Java 集合框架中的一种实现了 Set 接口的类&#xff0c;它通过一个红黑树&#xff08;Red-Black Tree&#xff09;来存储元素。由于使用了树结构&#xff0c;TreeSet 保证了元素的有序性&#xff0c;并且不允许重复元素。 1. TreeSet 的基本特性 有序性&#xff1…...

Elasticsearch:同义词在 RAG 中重要吗?

作者&#xff1a;来自 Elastic Jeffrey Rengifo 及 Toms Mura 探索 RAG 应用程序中 Elasticsearch 同义词的功能。 同义词允许我们使用具有相同含义的不同词语在文档中搜索&#xff0c;以确保用户无论使用什么确切的词语都能找到他们所寻找的内容。你可能会认为&#xff0c;由于…...

Docker安装分布式vLLM

Docker安装分布式vLLM 1 介绍 vLLM是一个快速且易于使用的LLM推理和服务库&#xff0c;适合用于生产环境。单主机部署会遇到显存不足的问题&#xff0c;因此需要分布式部署。 分布式安装方法 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) 数据符合“每个变量为一列&#xff0c;每个观察值为一行&#xff0c;每种类型的观察单位为一…...

二叉树的遍历方式和子问题思路

目录 二叉树的遍历&#xff1a; 前序遍历&#xff1a; 中序遍历&#xff1a; 后序遍历&#xff1a; 二叉树的基本操作&#xff1a; 求树的结点个数&#xff08;递归遍历思路&#xff09;&#xff1a; 求树的结点个数&#xff08;子问题思路&#xff09;&#xff1a; 求树的…...

运用Deek Seeker协助数据分析

我的数据源有两张表&#xff0c;一个是每日销售表(字段有日期、产品名称、实际销量)&#xff0c;一个是每月目标表(字段有年度月份、产品名称、目标销量);我的需求是&#xff0c;按月、按年来统计每个产品的目标完成情况请问用PowerBl进行分析&#xff0c;应该如何建立数据模型…...

服务器之连接简介(Detailed Explanation of Server Connection)

一台服务器最大能支持多少连接&#xff1f;一台客户端机器最多能发起多少条连接&#xff1f;&#xff1f; 我们知道TCP连接&#xff0c;从根本上看其实就是client和server端在内存中维护的一组【socket内核对象】&#xff08;这里也对应着TCP四元组&#xff1a;源IP、源端口、…...

低空经济:开启未来空中生活的全新蓝海

引言 随着科技的进步&#xff0c;我们不再仅仅依赖地面交通和传统物流。你是否曾幻想过&#xff0c;未来的某一天&#xff0c;快递、外卖可以像魔法一样直接从空中送到你手中&#xff1f;或者&#xff0c;你能乘坐小型飞行器&#xff0c;快速穿梭于城市之间&#xff0c;告别拥堵…...

主动视觉可能就是你所需要的:在双臂机器人操作中探索主动视觉

AV-ALOHA 系统使用用于 AV 的 VR 耳机实现直观的数据收集&#xff0c;并且 用于作的 VR 控制器或引线臂。这有助于捕捉全身和头部 远程作我们的真实和模拟系统的运动&#xff0c;记录来自 6 个的视频 不同的摄像头&#xff0c;并为我们的 AV 仿制学习策略提供训练数据。 加州大…...

洛谷 P6419 COCI2014/2015 #1 Kamp 题解

题意 一颗树 n n n 个点&#xff0c; n − 1 n-1 n−1 条边&#xff0c;经过每条边都要花费一定的时间&#xff0c;任意两个点都是联通的。 有 k k k 个人&#xff08;分布在 k k k 个不同的点&#xff09;要集中到一个点举行聚会。 聚会结束后需要一辆车从举行聚会的这点…...

在 Vue 项目中使用 SQLite 数据库的基础应用

目录 一、环境准备二、数据库连接与操作1. 创建数据库连接2. 创建表3. 插入数据4. 查询数据5. 更新数据6. 删除数据 三、在 Vue 组件中使用 SQLite 一、环境准备 安装 Node.js 和 npm&#xff1a;确保已安装 Node.js 和 npm。 创建 Vue 项目&#xff1a;使用 Vue CLI 创建一个…...

AI会话问答的页面滚动处理(参考deepseek页面效果)

近期在接入deepseekR1的深度思考&#xff0c;研究了下deepseek官网的滚动效果&#xff0c;大概如下&#xff1a;用户发出消息后&#xff0c;自动滚动到页面最底部&#xff0c;让最新消息展示在视野中&#xff0c;这时候&#xff0c;我们先处理一次滚动&#xff1a; const scrol…...

GRN前沿:DGCGRN:基于有向图卷积网络的基因调控网络推理

1.论文原名&#xff1a;Inference of gene regulatory networks based on directed graph convolutional networks 2.发表日期&#xff1a;2024 DGCGRN框架 中心节点和节点的构建 局部增强策略 1. 问题背景 在基因调控网络中&#xff0c;许多节点的连接度较低&#xff08;即…...

MongoDB 入门操作指南

文章目录 MongoDB 入门操作指南1. 连接到 MongoDB 数据库2. 查看当前数据库3. 显示所有数据库4. 切换或创建数据库5. 查看当前数据库中的所有集合6. 创建集合7. 插入文档插入单个文档插入多个文档 8. 查询文档查询所有文档查询匹配条件的文档格式化查询输出 9. 更新文档更新单个…...

共享设备管理难?MDM助力Kiosk模式一键部署

目录 1. 简化设备部署与配置&#xff1a;实现一键式部署 2. 自动化应用更新与内容推送&#xff1a;确保设备始终保持最新状态 3. 权限控制与设备安全&#xff1a;防止滥用与数据泄露 4. 远程管理与故障诊断&#xff1a;保障设备长期稳定运行 5. 数据分析与报告&#xff1a…...

HttpClient-Java程序中发送Http请求

配置 <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> </dependency> ps:aliyun-sdk-oss中已引入上述配置 HttpClient的核心API&#xff1a; Htt…...

硬件-电源-隔离与非隔离的区别

文章目录 一&#xff1a;隔离电源与非隔离电源1.1 充电器触电新闻1.2 电路拓扑1.3 隔离电源与非隔离电源的优缺点1.3 隔离电源与非隔离电源的选择1.3.1 隔离电源1.3.2 非隔离电源 二&#xff1a;注意事项2.1 隔离电源结构图2.1 隔离耐压测试方法 三&#xff1a;感悟道友&#x…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...

背包问题双雄:01 背包与完全背包详解(Java 实现)

一、背包问题概述 背包问题是动态规划领域的经典问题&#xff0c;其核心在于如何在有限容量的背包中选择物品&#xff0c;使得总价值最大化。根据物品选择规则的不同&#xff0c;主要分为两类&#xff1a; 01 背包&#xff1a;每件物品最多选 1 次&#xff08;选或不选&#…...

分布式光纤声振传感技术原理与瑞利散射机制解析

分布式光纤传感技术&#xff08;Distributed Fiber Optic Sensing&#xff0c;简称DFOS&#xff09;作为近年来迅速发展的新型感知手段&#xff0c;已广泛应用于边界安防、油气管道监测、结构健康诊断、地震探测等领域。其子类技术——分布式光纤声振传感&#xff08;Distribut…...

C++课设:实现本地留言板系统(支持留言、搜索、标签、加密等)

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏介绍&#xff1a;《编程项目实战》 目录 一、项目功能概览与亮点分析1. 核心功能…...

Python[数据结构及算法 --- 栈]

一.栈的概念 在 Python 中&#xff0c;栈&#xff08;Stack&#xff09;是一种 “ 后进先出&#xff08;LIFO&#xff09;”的数据结构&#xff0c;仅允许在栈顶进行插入&#xff08;push&#xff09;和删除&#xff08;pop&#xff09;操作。 二.栈的抽象数据类型 1.抽象数…...