路由策略与策略路由:从核心原理到实战配置的完整指南
你有没有遇到过这样的场景公司网络里财务部的数据必须走专线保证安全而普通员工的网页浏览走普通宽带就行或者你想让视频会议流量优先转发而文件下载可以稍微慢一点。这种“让不同的网络流量走不同的路”的需求在稍微复杂一点的网络里几乎天天见。很多人一听到“路由策略”、“策略路由”这些词就头疼觉得是高端玩家才玩得转的东西。网上的教程要么是满屏的命令行要么是抽象的理论图看完还是不知道从哪下手。其实核心思想并不复杂路由策略的本质不是创造新的路由而是给现有的路由选择过程加上一套“筛选”和“修改”的规则。它解决的不是“有没有路”的问题而是“选哪条路更好”的问题。今天我们就抛开那些让人望而生畏的术语从网络工程师实际工作的视角把“路由策略”和“策略路由”这两兄弟彻底拆开揉碎了讲清楚。你会发现它们不是用来炫技的复杂配置而是解决实际流量管理问题的必备工具箱。我们不仅要搞懂“是什么”更要弄明白“为什么需要它”以及“怎么一步步把它用起来”。1. 先别急着敲命令分清“路由策略”和“策略路由”到底差在哪这是第一个也是最容易混淆的坎。很多资料把这两个概念混着用导致初学者配置时一头雾水。我们可以用一个非常形象的类比来理解想象一下你是一个快递分拣中心的总调度员。面前有来自全国各地、要去往不同城市的包裹数据包也有好几条运输路线路由。路由策略你制定了一套规则用来影响“路线图”本身。比如你规定“所有从上海发来的、声称去往北京的路由信息我一律不相信不把它记入我的总路线图。” 或者“从广州来的路线信息如果距离超过1000公里我就给它加上50公里的‘管理距离’让它优先级变低。” 你的规则作用对象是“路由信息”路由表项通过过滤、修改路由的属性如优先级、开销值来间接影响后续所有包裹的走向。它的核心是控制路由信息的收发与优选工作在“控制平面”。策略路由你制定另一套规则用来直接指挥“每一个具体的包裹”。比如你规定“所有外包装上写着‘生鲜’的包裹不管路线图怎么指都给我走空运专线。” 或者“重量超过10公斤的大件包裹走陆运通道。” 你的规则作用对象是“数据包”本身基于数据包的源IP、目的IP、协议类型甚至端口号等特征直接指定转发路径完全无视或优先于全局路由表。它的核心是基于数据包特征进行转发工作在“转发平面”。简单总结一下关键区别特性路由策略策略路由作用对象路由信息路由表项数据包本身工作层面控制平面影响路由表生成转发平面影响数据包转发决策依据路由的属性来源、前缀、AS-Path等数据包的属性五元组、ToS等生效时机路由信息交换、路由表计算时设备转发每一个数据包时常见工具Route-Policy, Filter-Policy, AS-Path FilterPBRPolicy-Based Routing 本地策略路由类比制定地图的规则哪些路可以上地图哪条路是主干道指挥司机的规则救护车走应急车道货车走货车道理解这个区别至关重要。当你面对一个需求时首先要判断你是想影响所有去往某个目的地的流量通过修改路由还是想基于流量的具体特征进行精细分流前者用路由策略后者用策略路由。2. 路由策略如何当好路由信息的“质检员”与“调度员”理解了路由策略是管“地图”的我们来看看具体怎么管。它的应用场景非常广泛主要扮演两个角色“质检员”和“调度员”。2.1 场景一过滤与引入——当好“质检员”这是最基础也是最常用的功能。你的路由器会从不同的“渠道”路由协议如OSPF、BGP或者直连、静态路由学习到大量路由信息。但并不是所有信息你都想要。为什么需要过滤安全与稳定防止不可信的对等体给你发送错误或恶意的路由导致流量被劫持。节省资源避免路由表过于庞大消耗设备内存和CPU。策略控制只接受符合你业务需求的路由。比如在多ISP接入时只接收某个ISP发来的特定网段路由。怎么实现—— 核心工具Route-PolicyRoute-Policy是一个强大的策略框架它由若干个节点node组成每个节点里包含匹配条件if-match和执行动作apply。你可以把它想象成一个多层的过滤和加工流水线。 一个典型的用法是在BGP中控制路由的收发# 创建一个Route-Policy名为“FROM-ISP-A” route-policy FROM-ISP-A permit node 10 if-match ip-prefix ISP-A-Routes // 匹配一个预先定义好的前缀列表 apply local-preference 200 // 对匹配的路由设置较高的本地优先级LP优先选这条 route-policy FROM-ISP-A deny node 20 # 没有if-match表示拒绝所有其他路由然后在BGP对等体配置下应用这个策略bgp 100 peer 1.1.1.1 route-policy FROM-ISP-A import // 对从1.1.1.1收到的路由应用入方向策略关键点Route-Policy的执行是按节点顺序的一旦匹配就执行动作并跳出。最后的deny node是常见的“默认拒绝”做法确保只有明确允许的路由才会被处理。更简单的过滤Filter-Policy如果需求只是简单地过滤掉某些路由不修改属性filter-policyACL或前缀列表是更轻量的选择。常用于OSPF、IS-IS等协议在路由计算时过滤掉LSA或LSP中的某些路由防止它们进入全局路由表。2.2 场景二修改属性——当好“调度员”过滤是第一步更精细的控制是修改路由的属性从而影响路由的“竞选结果”。在路由协议中路由之间通过比较各种属性度量值、管理距离、本地优先级、MED等来决定谁优谁劣胜者进入路由表。为什么需要修改属性为了实现流量引导。比如你有两条去往同一目的地的链路主用和备用。你希望正常情况下流量走主用链路。这时你可以通过路由策略将来自主用链路方向的路由属性如BGP的Local-Preference调得更高使其在路由选举中胜出。一个典型的多出口流量调度案例BGP LP MED假设公司AS 100有两个ISP接入ISP-A (AS 200) 和 ISP-B (AS 300)。你想实现访问ISP-A的网络优先走ISP-A出口访问ISP-B的网络优先走ISP-B出口其他互联网流量默认优先走ISP-A。接收路由时打标签从ISP-A收到的所有路由设置高Local-Preference如150。从ISP-B收到的所有路由设置较低的Local-Preference如100。这样在出方向上所有流量默认优先选择LP更高的ISP-A出口。发送路由时做广告在向ISP-A通告路由时为其设置一个较小的MED值。在向ISP-B通告时设置较大的MED值。MED用于向邻居AS建议进入你AS的路径值越小越优。这样入方向上ISP-A的流量会更倾向于从ISP-A的入口进入你的网络。更精细的控制使用AS-Path过滤或前缀列表精确匹配ISP-A和ISP-B的特定网段只为这些路由应用特殊的LP或MED策略实现“访问谁就从谁的出口出”。注意Local-Preference只在同一AS内部有效用于影响出站流量选择。MED用于在多个入口EBGP对等体间影响入站流量选择但它的比较只在来自同一相邻AS的路由间进行。通过扮演好“质检员”和“调度员”路由策略让你从被动接收路由变为主动塑造网络的路由拓扑为流量工程打下基础。3. 策略路由当全局路由表不够用时如何为特定流量“开小灶”路由策略是通过修改“地图”来间接影响流量而策略路由则是直接给特定的“车辆”下达转向指令。它的优先级高于普通的路由表查询。当设备收到一个数据包准备转发时会先检查是否配置了策略路由如果匹配则按策略路由指定的下一跳或出接口转发如果不匹配再fallback到查询普通路由表。3.1 为什么需要“开小灶”—— PBR的典型场景服务质量保证让语音、视频等实时流量走低延迟、高带宽的专线让普通上网流量走廉价宽带。负载分担基于源IP地址将流量哈希到不同的链路上实现更灵活的负载均衡而不仅仅是基于目的IP。安全审计将所有来自特定服务器的流量先引导至一个防火墙或流量分析设备再转发出去。故障绕过当主链路故障时利用策略路由将关键业务的流量快速切换到备用路径而不依赖于路由协议的收敛。3.2 如何配置策略路由—— 一个清晰的四步法配置策略路由PBR可以遵循以下通用步骤这里以最常见的基于IP的PBR为例第一步定义“感兴趣流”—— 用ACL抓取流量你需要告诉设备什么样的流量需要特殊照顾。这通过访问控制列表ACL来实现。# 定义一个高级ACL 3000匹配源IP为192.168.1.0/24目的IP为10.1.1.1的流量 acl 3000 rule 5 permit ip source 192.168.1.0 0.0.0.255 destination 10.1.1.1 0你可以根据需求使用基本ACL匹配源IP、高级ACL匹配五元组来精确或模糊地定义流量。第二步制定“分流策略”—— 创建策略路由节点创建一个策略路由并定义节点。每个节点包含匹配条件和动作。# 创建一个名为VOICE-POLICY的策略路由 policy-based-route VOICE-POLICY permit node 10 if-match acl 3000 // 匹配第一步定义的ACL apply next-hop 202.100.1.1 // 指定下一跳地址走专线 apply ip-precedence 5 // 可选设置IP优先级用于后续QoS调度你可以创建多个节点实现更复杂的策略。例如node 20匹配另一类流量指定不同的下一跳或出接口。第三步应用策略—— 在入口“上岗执勤”策略路由需要在数据包的入接口上应用才能生效。因为转发决策需要在数据包进入设备后立即做出。interface GigabitEthernet0/0/1 ip address 192.168.1.254 255.255.255.0 ip policy-based-route VOICE-POLICY // 在此接口的入方向应用策略关键点策略路由是单向的。你需要在流量进入设备的接口上应用策略去影响其转发方向。返程流量如果需要同样的策略需要在另一端的入接口做相应配置。第四步验证与排错—— 确保策略生效配置完后绝不能假设它一定工作。使用display policy-based-route查看策略路由的配置和统计信息。使用debugging ip policy-based-route命令在测试环境谨慎使用实时查看数据包是否匹配了策略以及执行的动作。最关键的一步实际流量测试。从定义的源IP向目的IP发送测试流量如ping、tracert同时使用display ip routing-table查看正常情况下该目的IP的路由再使用tracert观察实际路径是否按策略指向了指定的下一跳。3.3 策略路由的“坑”与最佳实践性能影响策略路由需要检查每个数据包的报文头并与ACL规则进行匹配这会消耗CPU资源。在大流量场景下需评估性能。路由环路风险如果策略路由指定的下一跳不可达而设备又没有有效的路由将其送回可能导致环路。务必确保策略指定的路径是可达的。与路由协议协同策略路由不参与路由协议计算它指定的下一跳必须在路由表中存在直连或由路由协议学到否则策略会失效。先简后繁初期先用一条简单的策略如基于源IP进行测试确保流程跑通再逐步增加复杂的匹配条件。做好文档策略路由会改变默认的转发行为清晰的配置注释和拓扑文档对后续维护至关重要。策略路由给了你一把手术刀可以对流量进行极其精细的外科手术式控制。但它也是一把双刃剑配置不当会带来复杂性和故障隐患。记住一个原则能用路由策略解决的优先用路由策略只有当路由策略无法满足基于报文特征的精细控制时再考虑策略路由。4. 从理论到实战一个融合路由策略与PBR的综合实验设计纸上得来终觉浅。我们设计一个综合性的实验场景把前面讲的概念串联起来看看如何协同使用这两种工具。实验拓扑与需求公司有一台核心路由器Core-RT连接两个出口一条高速专线ISP-A下一跳1.1.1.1一条普通宽带ISP-B下一跳2.2.2.2。内部有两个网段研发部192.168.10.0/24和市场部192.168.20.0/24。需求1路由策略从ISP-A学习到的默认路由0.0.0.0/0其优先级应高于从ISP-B学到的确保绝大多数互联网流量默认走专线。需求2策略路由市场部的视频会议服务器192.168.20.100访问外部云视频服务假设目的IP为8.8.8.8必须强制走专线ISP-A即使宽带线路的路由成本更低。需求3路由策略拒绝接收来自ISP-B的关于公司竞争对手网段假设为100.100.100.0/24的路由。配置思路与关键片段满足需求1路由策略 - 修改管理距离# 假设通过BGP或静态路由从两个ISP学习默认路由 ip route-static 0.0.0.0 0.0.0.0 1.1.1.1 preference 5 # 专线路由管理距离设为5数值越小越优 ip route-static 0.0.0.0 0.0.0.0 2.2.2.2 preference 10 # 宽线路由管理距离设为10这样默认路由会优先选择专线。满足需求3路由策略 - 路由过滤# 首先创建一个前缀列表匹配竞争对手网段 ip ip-prefix COMPETITOR deny 100.100.100.0 24 ip ip-prefix COMPETITOR permit 0.0.0.0 0 le 32 # 允许其他所有 # 在BGP对等体入方向应用过滤假设与ISP-B建立BGP bgp 65001 peer 2.2.2.2 as-number 200 peer 2.2.2.2 route-policy BLOCK-COMPETITOR import # route-policy BLOCK-COMPETITOR deny node 10 if-match ip-prefix COMPETITOR route-policy BLOCK-COMPETITOR permit node 20满足需求2策略路由 - 基于源地址的强制引流# 第一步定义ACL匹配从市场部视频会议服务器去往云服务的流量 acl 3100 rule 5 permit ip source 192.168.20.100 0 destination 8.8.8.8 0 # 第二步创建策略路由指定下一跳为专线网关 policy-based-route VIDEO-CONF permit node 10 if-match acl 3100 apply next-hop 1.1.1.1 # 第三步在流量进入的接口连接市场部网络的接口上应用策略 interface GigabitEthernet0/0/20 ip address 192.168.20.254 255.255.255.0 ip policy-based-route VIDEO-CONF通过这个实验你可以清晰地看到路由策略需求1和3在控制平面运作通过修改静态路由优先级和过滤BGP路由塑造了全局的“路由地图”。策略路由需求2在转发平面运作针对特定的数据流源192.168.20.100 - 目的8.8.8.8无视全局路由表可能的选择直接指定了转发路径。它们各司其职又相互配合共同实现了复杂的流量管理目标。在实际网络运维中这种组合使用是非常普遍的。5. 思维进阶从单点配置到全局流量工程掌握了单个设备上的配置我们的思维需要再向上走一层。路由策略和控制不是孤立的技术点而是实现网络流量工程的基础手段。规划先行在动手敲命令之前一定要在拓扑图上画清楚流量从哪里来要到哪里去你希望它走哪条路径为什么哪些是全局策略适合路由策略哪些是局部特例需要策略路由维护成本策略路由的配置是分布式的贴在各个接口上。当网络拓扑变更时你需要检查所有相关的策略路由点。而路由策略尤其是BGP策略通常在路由协议进程下集中配置相对容易管理。记住配置的复杂度会转化为运维的复杂度。监控与验证配置不是终点。必须建立监控机制观察策略是否持续生效。利用display命令查看策略统计计数利用网络性能管理工具分析关键链路的流量是否符合预期。文档化将每一个重要的路由策略和策略路由的意图、匹配条件、执行动作以及应用位置记录在案。这对于故障排查和后续交接至关重要。回到我们最初的问题想让路由按你的想法跑你现在应该明白了这背后是一套从“控制信息”路由策略到“控制转发”策略路由的完整工具箱。核心不是死记命令而是培养一种思维当默认的、自动的路由选择不符合你的业务需求时你知道有哪些工具可以介入在哪个层面介入以及如何安全、有效地使用它们。从理解“路由策略管地图策略路由管车辆”这个根本区别开始到学会用Route-Policy过滤和调度路由再到用PBR为关键流量开辟绿色通道最后在综合设计中体会它们的协同。这条路每一步都踩在解决实际问题的点上。下次再面对复杂的流量调度需求时你可以先停下来画个图分分类然后从容地从这个工具箱里挑选合适的工具。这才是网络工程师从“配置者”走向“设计者”的关键一步。

相关新闻

MySQL数据库结构探查全攻略:从DESCRIBE到INFORMATION_SCHEMA

MySQL数据库结构探查全攻略:从DESCRIBE到INFORMATION_SCHEMA

1. 项目概述:为什么我们需要全面审视数据库结构?在日常的数据库开发、维护或者接手一个遗留项目时,我们经常会遇到一个非常实际的需求:快速、全面地了解数据库里到底有什么。这不仅仅是知道有哪些表,更重要的是理解这些…

2026/10/6 16:24:29 阅读更多 →
数学建模国赛培训:模型求解、结果分析与可视化实战指南

数学建模国赛培训:模型求解、结果分析与可视化实战指南

1. 项目概述:一场聚焦实战的赛前深度赋能每年到了这个时候,各大高校的数学建模竞赛备战群里,气氛就开始变得微妙起来。大家从最初的兴奋、好奇,逐渐转向一种带着焦虑的求知若渴。手里攒着几本经典教材,看过一些往届优秀…

2026/9/26 5:21:32 阅读更多 →
网络爬虫入门到实战:从数据采集原理到Python代码实现

网络爬虫入门到实战:从数据采集原理到Python代码实现

1. 项目概述:从“数据矿工”到“信息捕手”如果你在互联网上搜索过商品价格、追踪过新闻动态,或者好奇过某个论坛里大家都在讨论什么,那么你其实已经间接接触过网络爬虫的成果了。网络爬虫,这个听起来有点“黑客”气息的词&#x…

2026/10/13 2:12:11 阅读更多 →

最新新闻

并行编程——MPI 和OpenMPI 基本概念学习(一)

并行编程——MPI 和OpenMPI 基本概念学习(一)

文章大纲引言一、MPI 概述二、MPI基础数据类型1、使用MPI_Type_create_struct创建结构体类型数据类型1.1、在C中定义结构体并确定成员偏移量1.2、创建自定义 MPI 数据类型2、使用MPI_Type_create_subarray创建子数组类型数据类型2.1、确定子数组的形状和位置2.2、创建自定义 MP…

2026/10/14 1:53:15 阅读更多 →
syzkaller 依赖的 errchkjson 静态分析器:json.Marshal 错误处理与类型安全分类详解

syzkaller 依赖的 errchkjson 静态分析器:json.Marshal 错误处理与类型安全分类详解

测试操作系统网络安全 【免费下载链接】syzkaller syzkaller is an unsupervised coverage-guided kernel fuzzer 项目地址: https://gitcode.com/gh_mirrors/syz/syzkaller 点击查看 免费下载 本文围绕 syzkaller 仓库中 vendor 目录下的 errchkjson 文档展开&…

2026/10/14 1:53:15 阅读更多 →
Farm 懒编译(Lazy Compilation)实战指南:让大型项目开发编译从分钟级降到秒级

Farm 懒编译(Lazy Compilation)实战指南:让大型项目开发编译从分钟级降到秒级

前端构建构建工具开发工具 【免费下载链接】farm Extremely fast Vite-compatible web build tool written in Rust 项目地址: https://gitcode.com/gh_mirrors/fa/farm 点击查看 免费下载 Farm 是一款用 Rust 编写的 Vite 兼容 Web 构建工具,其「懒编译…

2026/10/14 1:53:15 阅读更多 →
TEngine 设计模式应用剖析:单例、工厂、观察者与状态机的工业化实现

TEngine 设计模式应用剖析:单例、工厂、观察者与状态机的工业化实现

游戏开发 【免费下载链接】TEngine Unity 商用级别开发框架,原生内置 AI 工作流支持,集成 HybridCLR 高性能热更、Obfuz 代码混淆加固、YooAssets 企业级资源管理方案,构建高效、安全、可扩展的工业化开发底座。 项目地址: https:…

2026/10/14 1:53:15 阅读更多 →
基于Vue和WebSocket的实时聊天系统实战:从轮询到长连接与踩坑记录

基于Vue和WebSocket的实时聊天系统实战:从轮询到长连接与踩坑记录

简介:这是一套基于WebSocket与Vue.js的在线聊天室系统设计Demo,面向前端开发学习者与全栈入门者,演示如何从零搭建支持实时双向通信的群聊与私聊场景。项目功能完整,涵盖私聊、群聊、消息已读与未读、未读消息提醒、聊天文字颜色区…

2026/10/14 1:53:15 阅读更多 →
新能源EPC项目SAP PS手册:从WBS到CJ88的落地指南

新能源EPC项目SAP PS手册:从WBS到CJ88的落地指南

简介:《新能源项目-2017年6月SAP项目SAP PS模块用户操作手册》是一份面向SAP项目实施顾问、新能源企业项目管理人员及信息化运维人员的操作指引,重点解决项目创建、WBS工作任务分解和标准网络复制等PS模块高频操作问题。文档共67页,以单个Wor…

2026/10/14 1:52:15 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →