三层交换机与路由器通信组网配置与排错实战指南
1. 从一个ping不通的下午说起很多人第一次接触三层交换机和路由器的组网都会遇到一个非常经典的场景核心交换机上划分了好几个VLAN下面挂了一堆终端路由器单独接在核心交换机的一个口上负责出口。配置看起来都没问题VLAN间也能互通但就是有一台PC ping不通路由器或者路由器ping不通某个VLAN里的设备。抓包一看ARP请求发出去了没人应答路由表里明明有直连网段下一跳却怎么都找不到。这个问题的根源往往不在配置写错了而在于对三层交换机与路由器之间到底该怎么通信这件事的理解有偏差。三层交换机本质上是带路由功能的交换机路由器是专职做路由转发的设备两者放在一起的时候谁负责哪一段路由、接口用三层口还是VLAN口、要不要起子接口、静态路由往哪个方向写这些细节决定了整张网能不能通。这篇内容就是围绕三层交换与路由器通信这个主题把我在实际组网中反复验证过的思路、配置和踩过的坑整理出来。适合已经会配VLAN、会写静态路由但对三层交换和路由器协同工作还有疑惑的网络从业者也适合正在准备网络方向认证、需要把知识点串起来的同学。看完之后你应该能独立设计一个核心三层交换出口路由器的典型组网并且知道每一行配置为什么这么写。2. 先搞清楚三层交换机和路由器到底差在哪2.1 转发机制的本质区别三层交换机和路由器最核心的差异在于转发路径。路由器收到一个包走的是拆帧—查路由表—重新封装帧的流程每个包都要经过CPU参与的路由查找高端路由器会用专用转发芯片但逻辑上仍是逐包路由。三层交换机则不同它的设计思路是一次路由多次交换第一个包走CPU做路由查找同时把源MAC、目的MAC、出接口这些信息写进硬件转发表FIB/邻接表后续同一个流的包直接由ASIC芯片线速转发不再经过CPU。这个差异带来的直接后果是三层交换机在同网段、跨VLAN的转发性能上远超同价位的路由器但在NAT、策略路由、复杂ACL、广域网接口这些路由器擅长的事情上三层交换机要么不支持要么支持得很勉强。所以典型组网里三层交换机负责内网VLAN间的高速互通路由器负责出口的NAT、拨号、专线接入各司其职。理解这一点非常关键因为它直接决定了后面配置时的分工内网路由写在三层交换机上出口路由和NAT写在路由器上两者之间只需要一条互联路由。2.2 接口形态的差异决定了连接方式三层交换机的接口默认是二层口要让它变成三层口需要手动切换不同厂商命令不同常见的是no switchport或者直接创建VLAN接口SVI。路由器则相反物理口默认就是三层口可以直接配IP。这就引出了一个常见的连接方式选择问题三层交换机和路由器之间到底用三层路由口互联还是用VLAN接口SVI互联用三层路由口互联把交换机上一个物理口切成三层口配个互联IP路由器对应口也配同网段IP。这种方式最干净互联网段独立不占用业务VLAN。用SVI互联在交换机上单独划一个互联VLAN比如VLAN 100把连接路由器的口划进这个VLAN然后在交换机上创建VLAN 100的SVI配IP路由器物理口配同网段IP。这种方式的好处是交换机侧不用改接口模式纯二层配置加一个SVI就行。两种方式都能通实测下来我更推荐三层路由口互联原因是互联网段和业务VLAN彻底隔离排错的时候一眼就能看出哪条是互联链路不会和业务VLAN混淆。但如果交换机型号较老、不支持接口切三层那就只能用SVI方式。2.3 路由表视角谁该知道哪些网段这是最容易出错的地方。很多人配完发现不通就是因为路由表的方向写反了或者漏了。站在三层交换机的角度它需要知道自己直连的所有业务VLAN网段自动生成直连路由出口路由器那边的网段如果有的话一条默认路由指向路由器让内网访问外网站在路由器的角度它需要知道和交换机互联的网段直连内网所有业务VLAN网段必须手动写静态路由指向交换机一条默认路由指向运营商让内网出去注意这里的关键路由器不会自动知道交换机下面的业务VLAN因为那些网段对路由器来说不是直连的。所以路由器上必须写静态路由把内网网段指向交换机的互联IP。这一步漏了就会出现内网能ping通路由器接口但路由器ping不通内网PC的经典现象。3. 一个可复现的典型组网设计3.1 拓扑与地址规划为了把问题讲透我设计一个最小但完整的组网。假设有一台三层交换机核心和一台路由器出口下面挂两个业务VLAN。设备接口角色IP地址说明三层交换机VLAN 10 SVI业务网关192.168.10.1/24办公VLAN网关三层交换机VLAN 20 SVI业务网关192.168.20.1/24服务器VLAN网关三层交换机物理口G0/1三层路由口10.0.0.1/30与路由器互联路由器物理口G0/0三层口10.0.0.2/30与交换机互联路由器物理口G0/1出口运营商分配访问外网地址规划上互联网段用10.0.0.0/30只有两个可用地址刚好够两端用不浪费。业务网段用192.168.10.0/24和192.168.20.0/24这是最常见的私网规划习惯。提示互联网段建议单独规划一个不冲突的小网段不要图省事直接用业务网段里的地址否则后面加设备或者做策略的时候会很别扭。3.2 三层交换机侧配置思路交换机侧要做三件事创建业务VLAN和SVI、把互联口切成三层口配IP、写默认路由指向路由器。以常见命令风格为例不同厂商命令有差异逻辑一致# 创建业务VLAN vlan 10 vlan 20 # 配置业务VLAN的SVI作为网关 interface vlan 10 ip address 192.168.10.1 255.255.255.0 interface vlan 20 ip address 192.168.20.1 255.255.255.0 # 把互联口切成三层口 interface gigabitethernet 0/1 no switchport ip address 10.0.0.1 255.255.255.252 # 写默认路由指向路由器 ip route 0.0.0.0 0.0.0.0 10.0.0.2这里有几个细节值得说。第一no switchport这步是把二层口变三层口很多新手会忘记结果配了IP发现不生效因为二层口根本不认IP。第二互联口用/30掩码255.255.255.252只有两个主机地址正好。第三默认路由的下一跳是路由器的互联IP10.0.0.2不是路由器出口IP这点别搞混。交换机侧不需要写业务VLAN的静态路由因为SVI配了IP之后直连路由会自动生成192.168.10.0/24和192.168.20.0/24会自动出现在路由表里。3.3 路由器侧配置思路路由器侧要做三件事配互联口IP、写内网静态路由指向交换机、配出口和NAT。# 互联口 interface gigabitethernet 0/0 ip address 10.0.0.2 255.255.255.252 # 内网静态路由指向交换机互联IP ip route 192.168.10.0 255.255.255.0 10.0.0.1 ip route 192.168.20.0 255.255.255.0 10.0.0.1 # 出口口假设是拨号或专线这里简化 interface gigabitethernet 0/1 ip address 运营商分配地址 # 默认路由指向运营商 ip route 0.0.0.0 0.0.0.0 运营商网关 # NAT配置让内网能访问外网 access-list 1 permit 192.168.10.0 0.0.0.255 access-list 1 permit 192.168.20.0 0.0.0.255 ip nat inside source list 1 interface gigabitethernet 0/1 overload interface gigabitethernet 0/0 ip nat inside interface gigabitethernet 0/1 ip nat outside路由器侧的关键是那两条静态路由。没有它们路由器就不知道内网网段在哪回包会直接丢掉。NAT部分是为了让内网能出去如果只是内网互通测试NAT可以先不配。3.4 为什么这样分工有人会问既然三层交换机也能写默认路由为什么不干脆让交换机做NAT路由器只做透明转发答案是三层交换机的NAT性能和功能都远不如路由器而且出口通常涉及拨号、专线、多线路负载这些是路由器的强项。让交换机专注内网高速转发路由器专注出口是性能和稳定性的最优解。还有一种做法是把默认路由写在交换机上指向路由器路由器上只写内网静态路由这也是对的而且更常见。核心原则就一条每个设备只负责自己该知道的路由不要越界。4. 配置跑通之后这些坑才是真正花时间的4.1 回程路由缺失最经典的单向通现象内网PC能ping通路由器互联口10.0.0.2但ping不通路由器出口或者外网反过来路由器ping内网PC也不通。原因几乎百分百是路由器上没有内网网段的回程路由。PC发包给路由器路由器收到后要回包但它路由表里没有192.168.10.0/24只能走默认路由丢给运营商包就丢了。排查方法很简单在路由器上show ip route看有没有内网网段。没有就补静态路由。这个坑我见过太多次尤其是刚接手别人配好的网络时第一件事就是查两边的路由表。4.2 互联口掩码写错导致看似通实际不通互联口用/30是对的但有人会顺手写成/24。10.0.0.1/24和10.0.0.2/24在同一网段能通看起来没问题。但一旦互联网段里还有其他设备或者后面要做策略路由/24会引入一堆不必要的直连路由排错时干扰判断。更隐蔽的是掩码写错导致一端认为对方在同网段另一端认为在不同网段。比如一端/30一端/24/30那端认为10.0.0.2是直连/24那端也认为10.0.0.1是直连表面上能通但ARP行为和路由行为会不一致某些场景下会出现间歇性丢包。所以互联口掩码两端必须一致推荐统一用/30。4.3 VLAN接口没upSVI的经典陷阱用SVI方式互联的时候创建了VLAN 100的SVI配了IP但SVI一直是down的。原因是VLAN 100里没有任何物理口是up的。三层交换机的SVI有个特性只有当这个VLAN里至少有一个物理口处于up状态SVI才会up。解决办法是把连接路由器的那个物理口划进VLAN 100并且确保这个口是up的。如果用的是三层路由口方式就不存在这个问题这也是我推荐三层路由口的原因之一。4.4 ARP表项和MAC地址表的联动问题三层交换机做VLAN间路由时会涉及改MAC的操作。PC发给网关的包目的MAC是网关SVI的MAC交换机路由后转发到另一个VLAN源MAC会变成出接口SVI的MAC。如果中间有设备做了MAC绑定或者ARP静态绑定改MAC之后可能对不上导致丢包。这个坑在接入安全做得比较严的网络里常见。排查时看交换机的ARP表和MAC表确认网关MAC和终端学到的网关MAC一致。不一致就检查是不是有静态绑定没更新。4.5 默认路由的下一跳不可达陷阱交换机上写ip route 0.0.0.0 0.0.0.0 10.0.0.2但互联口没配或者配错下一跳10.0.0.2不可达这条默认路由不会生效不会进路由表。现象是内网出不去但交换机上明明写了默认路由。排查show ip route看默认路由在不在。不在就检查互联口状态和IP。这个坑的本质是路由生效的前提是下一跳可达很多人只盯着路由配置忘了检查底层接口。5. 进阶场景多VLAN、多线路、策略路由怎么处理5.1 多VLAN场景下的路由汇总业务VLAN多了之后路由器上一条条写静态路由很累而且容易漏。这时候可以做路由汇总。比如内网网段是192.168.10.0/24到192.168.20.0/24如果规划得规整可以汇总成192.168.16.0/20之类的一条路由指向交换机。但汇总的前提是地址规划要连续。如果VLAN 10是192.168.10.0/24VLAN 20是192.168.20.0/24中间跳过了192.168.11.0到192.168.19.0汇总就会把这些不存在的网段也指过去虽然不影响转发因为交换机上没有这些网段会返回不可达但不够干净。所以规划阶段就要想好汇总的可能性。5.2 双线路出口的选路出口有两条线路比如一条主用一条备用时路由器上会有两条默认路由通过管理距离或者策略来决定主备。这时候三层交换机侧通常不用改还是默认路由指向路由器互联口。但如果要做基于源地址的选路比如办公VLAN走线路A服务器VLAN走线路B就需要在路由器上做策略路由PBR根据源网段匹配不同的下一跳。策略路由的配置逻辑是定义ACL匹配源网段定义route-map设置下一跳然后在互联口上应用。这个场景下三层交换机侧依然只写一条默认路由所有选路逻辑集中在路由器保持内网简洁。5.3 三层交换机和路由器跑动态路由如果内网网段经常变动静态路由维护成本高可以考虑在三层交换机和路由器之间跑OSPF或者RIP。三层交换机把业务VLAN网段发布出去路由器把默认路由发布进来双方自动学习。配置上交换机侧把业务网段和互联网段加入OSPF区域路由器侧同样。注意不要两边都发布默认路由否则会形成环路或者次优路径。通常做法是路由器发布默认路由交换机只接收不发布。动态路由的好处是扩展性强坏处是排错复杂度上升。小型网络网段少于10个用静态路由完全够用没必要上动态路由。6. 排错时我习惯按这个顺序走一遍遇到三层交换和路由器不通的问题我一般按下面的顺序排查基本能覆盖90%的情况。第一步看物理层和接口状态。互联口是不是up速率双工对不对光模块有没有问题。这一步排除硬件和链路问题。第二步看互联网段能不能通。在交换机上ping路由器互联IP在路由器上ping交换机互联IP。不通就查IP配置和掩码通了再往下。第三步看路由表。交换机上show ip route确认有业务网段直连路由和默认路由路由器上show ip route确认有内网静态路由和默认路由。缺哪条补哪条。第四步看ARP。在交换机上show arp看能不能学到路由器的MAC在路由器上show arp看能不能学到交换机的MAC。学不到就查VLAN划分和接口模式。第五步分段ping。从内网PC ping网关通ping路由器互联口通ping路由器出口通ping外网通。哪一步断问题就在哪一段。第六步抓包。前面都查了还不通就在互联口抓包看包有没有发出去、有没有回来、MAC地址对不对。抓包是最直接的证据。这个顺序的核心逻辑是从底层往上层走从近往远走不要一上来就怀疑路由配置很多时候问题在更底层。7. 几个容易被忽略的实操细节7.1 保存配置这件事别偷懒配置跑通之后一定要保存。三层交换机和路由器的配置在重启后会丢失除非保存到启动配置。我见过有人调试了一下午终于通了结果断电重启全没了又得重来。保存命令通常是write或者copy running-config startup-config不同设备略有差异。7.2 互联口建议关闭不必要的协议互联口是点对点链路可以关闭一些不必要的协议减少干扰。比如关闭STP如果是三层口本来就不跑STP、关闭CDP或者LLDP如果不需要邻居发现。这些不是必须的但在对性能敏感的场景下能减少一点开销。7.3 记录互联网段和IP组网做完之后把互联网段、两端IP、路由指向这些信息记在文档里。后面加设备或者排错的时候不用再去翻配置。这个习惯看起来小但能省很多时间。7.4 测试要用真实流量配置完只用ping测试是不够的ping走的是CPU路径不代表转发路径没问题。有条件的话用真实业务流量测一下或者用大包ping比如ping -l 1500测试MTU和分片。有些问题只有在大流量或者特定包长下才会暴露。8. 关于这套组网我自己的几点体会三层交换机和路由器协同工作说到底就是分工和路由可见性两件事。分工清楚了交换机管内网、路由器管出口各干各的路由可见性保证了每个设备都知道对方那边的网段在哪包才能来回都找得到路。我刚开始接触这类组网的时候最容易犯的错就是以为配了IP就能通忽略了路由是双向的。后来养成了一个习惯配完任何一段路由都问自己一句回包怎么走。这一问能提前发现大部分问题。另外互联方式的选择上如果设备支持优先用三层路由口省心。SVI方式虽然也能用但多了一层VLAN的依赖排错时多一个变量。地址规划上互联网段单独规划、业务网段连续规划为后面汇总和扩展留余地。这套组网看起来简单但真正把它配稳、配到能扛住日常运维还是需要把每个细节都想清楚。上面这些内容是我在实际项目中反复验证过的配置可以直接参考排错顺序也可以直接套用。如果你的组网里还有防火墙或者负载均衡设备思路是一样的无非是多一段互联、多一组路由核心逻辑不变。

相关新闻

西安80转CGCS2000:ArcGIS七参数转换全流程与避坑指南

西安80转CGCS2000:ArcGIS七参数转换全流程与避坑指南

简介:面向测绘、GIS及国土规划从业者的一份技术文献,针对1980西安坐标系与2000国家大地坐标系的转换难题展开研究。文中系统梳理了两套坐标系的参考椭球参数、原点定义及差异,重点解析七参数转换模型(旋转、缩放、平移&#xff09…

2026/10/14 3:12:33 阅读更多 →
基于Web Component的AI表单填充SDK:从Schema提取到跨框架集成

基于Web Component的AI表单填充SDK:从Schema提取到跨框架集成

上个月被某后台系统折腾得没脾气:一沓 PDF 合同里的客户姓名、证件号、开户行,得对着屏幕一条条粘到表单里,几十个字段对下来眼睛都花了。为了把这类重复劳动抛给大模型,我动手做了一个用 Web Component 封装的人工智能表单填充 S…

2026/10/14 3:12:33 阅读更多 →
信贷风控策略迭代:业务零代码 ML 平台的分层架构

信贷风控策略迭代:业务零代码 ML 平台的分层架构

银行信贷风控里,策略与信用评分模型的迭代频率在抬高:规则分箱、特征入模、阈值调整往往希望 在试验环境快速闭环,再经回溯与审批进入决策引擎。若每次改动都走传统「提需求 → 数据科学排期 → 发版」链路,周期与人力成本都偏高。…

2026/10/14 3:11:33 阅读更多 →

最新新闻

网络安全密码学核心考点:从古典密码到数字签名复习指南

网络安全密码学核心考点:从古典密码到数字签名复习指南

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

2026/10/14 3:56:41 阅读更多 →
FFmpeg Bitstream Filter原理与实战:码流语法转换核心技术

FFmpeg Bitstream Filter原理与实战:码流语法转换核心技术

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

2026/10/14 3:56:41 阅读更多 →
STM32F030R8Tx使用HAL库实现ADC DMA多通道采集与问题排查

STM32F030R8Tx使用HAL库实现ADC DMA多通道采集与问题排查

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

2026/10/14 3:56:41 阅读更多 →
免费AI配音软件怎么选?媒小三配音适合哪些人

免费AI配音软件怎么选?媒小三配音适合哪些人

想给视频配音,又不想自己反复录制,AI 配音是一个值得尝试的办法。输入文案、生成语音,再根据画面调整节奏,就能完成基础旁白制作。不过,搜索免费 AI 配音软件时,不能只看标题里有没有“免费”。能免费体验哪…

2026/10/14 3:56:41 阅读更多 →
LangGraph 进阶:把 State 玩明白,Command 让你少写一半路由

LangGraph 进阶:把 State 玩明白,Command 让你少写一半路由

上篇咱们把 LangGraph 的骨架(State / Node / Edge)搭起来了。这篇老哥带你把两个最容易被新手忽视、却决定你写得好不好的核心机制啃透:State 和 Command。用大白话讲:State 决定了一张图里能流动什么数据、节点之间怎么协作&…

2026/10/14 3:56:41 阅读更多 →
cmake-3.10.0-win64-x64.rar 安装与构建实战:老版本CMake在Windows环境下的完整使用指南

cmake-3.10.0-win64-x64.rar 安装与构建实战:老版本CMake在Windows环境下的完整使用指南

简介:面向Windows 64位平台的CMake 3.10.0安装包,适用于需要在Windows环境中开展跨平台构建工作的开发者、项目维护者与初学者。CMake是开源构建系统,不直接编译代码,而是读取项目中的CMakeLists.txt配置,解析目标、源…

2026/10/14 3:55:41 阅读更多 →

日新闻

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/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →