FileZilla Server v0.9.60实战:轻量FTP部署、权限配置与自动化归档

简介:资源内收录了FileZilla Server v0.9.60的安装程序与配套说明文档,适合个人开发者、中小企业或网管人员快速搭建轻量级FTP服务器,解决跨设备文件共享、数据备份及远程访问等需求。压缩包内共两个文件,一个是包含服务器引擎和管理界面的exe安装程序,另一个是htm格式的使用说明,整体大小仅2.1MB,部署快捷,对系统资源的占用也极低,目前已有458人学习或下载。说明文档对FTP服务的核心操作进行了较全面的梳理:从主动/被动两种连接模式的区别,到默认21端口的修改方法;从多用户账户的创建与口令设置,到目录级读写权限和访问时间段的精细管控;同时还介绍了SSL/TLS加密配置以及日志记录与异常分析技巧。借助这份资料,读者可以在安装后直接参照说明完成各项功能配置,并在出现连接异常或安全疑问时获得排查思路。对于希望系统掌握FTP服务器搭建、权限管理和安全加固的中初级用户来说,这是一份实用的上手资源。

1. 为什么 FileZilla Server FTP 服务器 v0.9.60 还值得继续用:轻量、透明,适合内部文件交换

团队需要快速搭一个内网 FTP,又不想被新版本花哨的界面和强制升级拖住时,FileZilla Server FTP 服务器 v0.9.60 是绕不开的一个选择。这个版本体量小,配置界面直白,对 Windows 老版本兼容好,在没有域控、没有 NAS 的环境里,十几分钟就能把文件通道立起来。我不是说它比现代 FTP 服务强,而是它把“你只要一个被动接收和主动推送的 FTP 出口”这件事做到最省心。适合做开发环境临时共享、合作方文件收件、设备固件分发,前提是你不拿它硬扛公网大流量。下面从部署、用权、避坑到脚本化,把 v0.9.60 真正能落地的那部分讲清楚。

2. 安装与初始化部署:解压、服务注册、端口确认和第一个 FTP 会话

2.1 解包安装:把服务端和界面程序分开理解

v0.9.60 的安装包通常由两部分组成:FileZilla Server.exe(后台服务)和FileZilla Server Interface.exe(管理界面)。我习惯先卸载旧版本或别的 FTP 服务端,避免端口和驱动纠缠。双击安装文件之后,设置里重点看两个选项:安装成系统服务还是手动启动;管理界面监听端口默认是 14142。

安装到目标路径后,先不要急着启动。打开安装目录,确认存在FileZilla Server.xml这个配置文件,它是后续所有用户、共享路径、权限和被动模式参数的存储位置。这个文件是整个服务端的“单一事实来源”,手动编辑或程序批量修改都靠它。常见做法是安装完先停服务,备份一份原始 xml 再去动界面配置,这样出了问题能把配置恢复到底。

2.2 服务注册、端口确认与管理机使用

如果安装时没有选择“Install as service”,我一般会用以下两条命令把服务挂到系统服务里。注意,要以管理员身份打开终端执行,否则注册服务会报“拒绝访问”。

net stop "FileZilla Server FTP Server" 2>nul net start "FileZilla Server FTP Server"

第一条命令在服务未启动时会把错误信息输出到空设备,不影响后续;第二条命令真正启动服务。如果服务名不对,去“服务”管理里查一下准确名称,常见名称是FileZilla Server FTP Server,不同小版本可能有细微差异,直接按错的名称用会提示“服务名无效”。

服务起来后,检查 21 号端口是否在监听:

netstat -ano | findstr ":21"

看到监听的 PID 后,再去任务管理器对一下是否为 FileZilla Server 进程。这一步能帮你区分“服务没起来”和“端口被别的 FTP 占住”。如果 21 端口被 IIS FTP 或别的程序占用,回安装目录里把配置里的监听端口改成 2121,或者把占用程序停掉。实际上我遇到更多的情况是:服务器本机连得上,局域网其他机器连不上。原因基本都在 Windows 防火墙,先加一条入站规则放行 21 和后面要设置的被动模式端口段:

netsh advfirewall firewall add rule name="FileZilla Server 21" dir=in action=allow protocol=TCP localport=21 netsh advfirewall firewall add rule name="FileZilla Server Passive" dir=in action=allow protocol=TCP localport=50000-50100

第二条里的主动端口范围是我习惯用的,等第四部分配置被动模式时,记得保持和这里一致,否则防火墙是白放行的。管理界面连接时,服务器主机填127.0.0.1,端口填14142,这是在本地管服务;跨机器管服务需要显式在服务端设置“允许来自任何 IP 的管理连接”,非必要不打开。

3. 用户与权限:把目录安全地开放给不同角色

3.1 创建用户和组:主目录、虚拟目录与共享路径的映射

理清主目录和共享路径是 v0.9.60 里比较容易绕晕的点。界面上Edit > Settings > Users里,先建一个用户,指定Home directory。主目录的意思是这个用户登录后默认所在的目录,用户能访问的范围默认被限制在主目录下的真实目录或虚拟目录里。

例如用户ops,主目录设置为D:\FTPRoot\ops,这个目录下又有uploads、downloads两个真实文件夹。如果想把另一个磁盘上的E:\archive也共享给ops,就必须添加虚拟目录映射,界面里叫Virtual path。常见的设置是:

  • Virtual path:/archive
  • Native path:E:\archive

这里最反直觉的地方是:用户在客户端看到的/archive并不是真实存在的目录名,它只是服务器端的替身。客户端访问ftp://host/archive/时,服务器把请求转到了E:\archive。如果你不映射,就算文件在E:\archive,用户也看不到它,即使你给了用户读取权限也没用。新人最爱在这里翻车,权限给了一大堆,客户端那边还是“目录不存在”。

多个用户之间如果需要复用一套共享目录,可以用Groups。比如建一个content组,组里统一加虚拟目录和权限,再把ops、editor加进组。组权限和用户权限是叠加的,最终生效权限取并集。因此,如果组里有人能删除文件,而你不希望某个账号删除,就要在用户属性里把删除权限关掉,单独对齐到每个人。

3.2 每一项权限的真实影响:从只读到删除的取舍

v0.9.60 的权限粒度相比新版并不花哨,但它每一个勾选项都会直接影响行为。常见勾选及其作用如下:

权限项实际影响典型用法
Read允许列出目录和下载文件所有只读下载账号必开
Write允许上传文件和创建目录收件目录、上传账号必开
Delete允许删除文件和目录内部共享会开,对账目录谨慎开
Append允许续传文件和追加写入日志收集、大文件断点续传
List控制目录列表可见性关掉后客户端看不到文件列表,但知道路径可下载

我记得最深刻的一个坑是:目录共享给外部合作方时,为了安全只勾了Read和List,合作方反馈能登录、能看到目录,但下载每个文件都提示“550 Permission denied”。检查很久才意识到,Read和List是不同权限,默认列表目录时客户端会先执行LIST命令,如果List没勾,目录虽然映射存在但枚举被拒。后来我养成了习惯:只读账号必须同时勾Read + List;上传账号必须同时勾Write + List,否则传完文件客户端刷新卡在列表上。

权限还有一层隐藏属性是速度限制。在用户属性页里可以设置Speed Limits,按“天、周”限制传输带宽。我一般给协作收件目录限 5MB/s,防止某个同事一次性推几十个 G 文件把出口带宽占满。限速是服务端硬限制,客户端无法绕过,这点比在交换机上做 QoS 要省事。

位置权限和目录权限要分清。位置权限决定用户能进入哪些目录,目录权限决定用户在目录里能做什么。一个用户即使加入了组拿到全部目录的访问权,如果文件所在目录没有设置共享,依然进不去。所以排查问题时,先看“虚拟目录是否映射对”,再看“账号是否被加入对应组”,最后才看具体的权限勾选。这顺序能省至少一半排障时间。

4. 连接排障与避坑:防火墙、被动模式、编码与中断问题

4.1 参数调优:被动模式端口范围、外部 IP 与 UTF-8

FTP 协议有两类数据连接方式。主动模式下,服务器主动连回客户端的随机端口;被动模式下,服务器开一个端口等客户端来连。在 NAT 和云环境下,主动模式基本不可用,所以几乎所有人都选择被动模式。FileZilla Server 的被动端口范围默认是空的,也就是让系统自动分配端口,这给防火墙和路由映射造成了灾难。

我一般手动指定一个端口段,例如:

  • 被动端口范围:50000 - 50100
  • 外部 IP:如果服务器在路由器后面,填路由器的公网 IP;如果直接有公网 IP,就填服务器自身 IP。

设置入口在服务端界面的Edit > Settings > Passive mode settings。填好之后,回到上一部分的防火墙命令,端口段必须完全一致,一个数字都不能错。否则客户端能看到目录,但数据连接超时,连目录列表都拉不动。

v0.9.60 这个年代的服务端对 UTF-8 的处理和现代客户端不完全一致。早期版本默认使用本地系统编码,比如中文 Windows 上是 GBK,而新出的 FTP 客户端普遍默认 UTF-8。两边编码不一致,中文文件名会变成乱码,甚至在客户端显示成问号。解决办法是在服务端设置里把Force UTF-8或Use UTF-8选项打开。如果服务端版本不支持 UTF-8 开关,则要在客户端那边把字符集手工切到GBK或Windows ANSI,保证两边编码一致。

4.2 避坑记录:五个反馈最多的现象与解决

这里把我在实操里遇到最高频的几个问题按“现象 → 原因 → 解决”写清楚,可以直接对应到你的排障现场。

1. 现象:外部客户端连接被拒绝,但本机 FTP 连得很顺畅。
原因:防火墙没有放行 21 端口,或者服务端没有监听在外部网卡上。v0.9.60 默认监听所有地址,但 Windows 防火墙常常弹窗后就被静默拦截。
解决:先用上一节的 netsh 命令把 TCP 21 放行,再确认服务状态。如果还不行,在服务端设置里查看Bind IP,有多个网卡时拉勾要选Default或具体外网地址,不要选 127.0.0.1。

2. 现象:客户端能连接,也能看到目录,但一传文件就卡住,最后提示连接超时。
原因:被动模式端口段和防火墙规则不一致,或者路由器没做端口转发。大多数情况下,客户端已经自动切到被动模式,但服务器开出的数据端口被防火墙挡住。
解决:把被动模式范围固定为50000-50100,在防火墙对这一段 TCP 端口放行。如果服务器在路由器后,还要在路由器上设置端口转发,把50000-50100全部转到服务器内网 IP。传给对方时,让客户端主动选择“被动模式”。

3. 现象:上传的中文文件名在服务器上变成乱码,或者下载回来文件名现成乱码。
原因:服务端用本地系统编码(例如 GBK),客户端用 UTF-8,两者对同一串字节的解释不一样。
解决:服务端能够设置 UTF-8 的,优先打开;不能设置的,改客户端字符集。另外还要检查 Windows 区域设置里面的“使用 Unicode UTF-8 提供全球语言支持”是否被系统级打开,一旦打开,v0.9.60 的编码行为又可能改变,此时最好统一所有客户端都用 UTF-8 连接。

4. 现象:超过 2GB 的大文件传一半断掉,续传也续不上。
原因:旧版服务端默认不支持大文件断点续传的配置细节,加上客户端在断点续传时需要发起REST命令,如果服务端未开启Append/Resume权限,续传请求会直接被拒绝。
解决:在用户权限里勾选Append,同时在客户端设置“如果文件存在则续传”。还有一个隐藏点:FTP 传输超过 2GB 时,部分中间设备和旧版服务端对文件偏移量的处理会出问题,此时把服务端和客户端都换成支持 64 位大文件的新版本,或者改用 SFTP 通道,不要在单条 FTP 连接里死磕。

5. 现象:服务器重启后服务处于停止状态,手动启动后又提示“Address already in use”。
原因:另一个 FTP 服务或者占用了 21 端口的进程随系统启动了,FileZilla Server 启动改到了后面,绑不上端口。
解决:先把占用 21 端口的进程找出来再停掉,然后把 FileZilla 服务设为“自动(延迟启动)”,让它晚于其他服务启动。顺手在服务属性里把“恢复”选项卡设置成:第一次失败后重启服务,这样进程意外退出时能恢复。

这五条记录基本覆盖了内网和轻量公网场景里九成以上的问题。遇到更复杂的环境时,记得去查看服务端日志,在Logging设置里把日志级别从None调整到Info或Debug,日志文件路径在配置里能看到。日志不是用来事后翻旧账的,它会把每个客户端的控制命令和数据连接状态都记下来,定位“哪个命令触发了拒绝”最直接。

5. 进阶玩法:用 Python 和回调脚本把 FileZilla 服务器变成自动归档后端

5.1 用 ftplib 实现每日自动归档

FileZilla Server v0.9.60 提供了稳定的 FTP 服务入口,但它的图形管理界面不适合做自动化运维。我会在服务器上放一个 Python 脚本,通过ftplib定时到服务器取文件、做分类归档。这个方式不依赖第三方库,Windows 上只要装了 Python 环境就能跑。

import ftplib import os from datetime import datetime FTP_HOST = "127.0.0.1" FTP_PORT = 21 FTP_USER = "archive" FTP_PASS = "your_password" REMOTE_DIR = "/archive" LOCAL_DIR = r"D:\local_backup" today = datetime.now().strftime("%Y%m%d") local_subdir = os.path.join(LOCAL_DIR, today) os.makedirs(local_subdir, exist_ok=True) ftp = ftplib.FTP() ftp.connect(FTP_HOST, FTP_PORT, timeout=30) ftp.login(FTP_USER, FTP_PASS) ftp.cwd(REMOTE_DIR) target_ext = [".log", ".csv", ".zip"] for name in ftp.nlst(): if name.endswith(tuple(target_ext)): local_path = os.path.join(local_subdir, name) with open(local_path, "wb") as f: ftp.retrbinary(f"RETR {name}", f.write) print(f"archived: {name} -> {local_path}") ftp.quit()

逻辑简述:连接目标地址和端口后登录,切换到/archive目录,用nlst()列出所有文件名,筛选出.log .csv .zip后缀,逐个用retrbinary下载到本地当天日期目录里。FTP_PORT必须与服务端一致,FTP_USER和FTP_PASS放到独立配置里,不要硬编码到生产代码。如果在公网环境跑这脚本,建议给账号单独建一个只读用户,只给Read和List权限,避免脚本意外把服务器上的文件改乱。

这里特别提一下nlst()和mlsd()的差别。v0.9.60 对MLSD命令支持不完整,mlsd()在新客户端里好用,但面对这个老版本时,用nlst()更稳妥。虽然拿不到文件修改时间,但配合当天目录归档,已经能满足多数自动收集场景。

5.2 验证手法:端口探测、日志落盘和应用层探活

脚本跑通后,我还会配置一套探活,否则半夜服务挂掉时,第二天看到一堆归档失败也会滞后半天。探活思路分成三层:

  • 第一层,检查端口:telnet 192.168.1.10 21,或直接用 Python 的socket.connect_ex探测。
  • 第二层,检查进程:确认服务进程名和 PID 都在,且服务状态是Running。
  • 第三层,检查应用层:用脚本定时登录 FTP,执行一次dir或下载一个探针文件。应用层探活能发现“端口开着但权限故障”这类假死状态。

可以把探活结果写到本地日志里,再用 Windows 任务计划程序定时跑 Python 脚本,指派archive_job.py和healthcheck.py。任务计划里的时间安排要避开服务端的限速窗口,如果服务端限速了某用户,自动归档账号也受拖累,这个要单独开免限速。

v0.9.60 的乐趣在于它的配置是以xml文件为中心的,我可以把整份用户配置复制到另一台服务器上,改两个路径就能完成迁移。比从图形界面一个个创建用户快得多。我现在每部署一台新的 Windows 服务器,都先把被动端口段、防火墙规则、日志路径这三样写下,再启动服务。从那以后,但凡遇到 FTP 相关的故障,我都会强制走一遍这四步:查服务状态、查端口监听、核对被动模式端口段、看服务端日志。这个习惯帮我省下很多次半夜救火,希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

程序员创意开发大赛实战:轻量级插件设计与合规电子券实现

程序员创意开发大赛实战:轻量级插件设计与合规电子券实现

1. 项目概述:一场面向程序员的创意开发大赛,本质是技术能力与商业洞察的双重验证“WorkBuddy和麦当劳,欢迎你来程序员创意开发大赛,赢50次巨无霸免费兑换券和10240积分!”——这个标题乍看像一则促销广告,但…

2026/10/20 14:52:09 阅读更多 →
Flink实时TopN热榜实战:两级聚合与性能调优全解析

Flink实时TopN热榜实战:两级聚合与性能调优全解析

1. 项目拆解:实时TopN热榜到底在算什么做实时计算的人,基本都绕不开热榜这个需求。无论是电商平台的大促实时销量榜、内容社区的今日热帖榜、直播间的人气榜,还是音乐App的热歌榜,本质上都是同一类问题:在某个时间窗口…

2026/10/20 14:52:09 阅读更多 →
微信消息结构化:本地代理实现任务自动化注入

微信消息结构化:本地代理实现任务自动化注入

1. 这不是“微信登录”,而是工作流的神经突触 “WorkBuddy链接微信”这个标题,乍看像一句功能描述,实则藏着一个被多数人忽略的本质问题:我们每天在微信里处理的不是“消息”,而是 未结构化的任务毛坯 ——客户临时发…

2026/10/20 14:52:09 阅读更多 →

最新新闻

远程串流玩3A大作:从原理到实战的完整指南

远程串流玩3A大作:从原理到实战的完整指南

1. 从一则发售传言说起:为什么玩家开始琢磨“远程玩” 最近游戏圈最热闹的消息,莫过于《生化危机9》的传闻再度发酵。虽然官方一直没有正式确认,但几轮爆料已经把“恐怖生存”“开放村庄”“新主角团”这些关键词炒得沸沸扬扬。身边好几个朋友…

2026/10/20 15:43:37 阅读更多 →
AI视频生成实测:能力边界、时间一致性与素材拼接工作流

AI视频生成实测:能力边界、时间一致性与素材拼接工作流

近两年只要你在内容平台刷短视频,一定见过挂着“AI生成”标签的片段。有些确实唬人——画面细腻、运镜带胶片感、光影统一得不像实拍,但只要你上手用上三五天,就会迅速从“卧槽这也可以”变成“嗯?怎么又崩了”。这篇不种草也不画…

2026/10/20 15:43:37 阅读更多 →
ppt-master:用代码把PPT制作变成自动化流水线

ppt-master:用代码把PPT制作变成自动化流水线

1. 项目缘起与核心定位第一次看到“ppt-master”这个命名,我脑子里蹦出来的第一个念头是:又是一个想用代码干掉重复劳动的轮子。但仔细琢磨了一下,这个方向确实戳中了很多人的痛点。不管你是做技术的、做市场的、还是做行政的,只要…

2026/10/20 15:43:37 阅读更多 →
ppt-master:代码驱动的自动化幻灯片生成引擎

ppt-master:代码驱动的自动化幻灯片生成引擎

1. 项目概述:这不是一个PPT模板库,而是一套可编程的幻灯片生成引擎“ppt-master”这个名称乍一听像某个网红PPT资源站的副标题,或是某款带“Master”后缀的美化插件。但实际接触过它的开发者会立刻意识到:它根本不是传统意义上的模…

2026/10/20 15:43:37 阅读更多 →
INAV-Configurator 4.0.0:多旋翼飞控实时状态监控与闭环调参中枢

INAV-Configurator 4.0.0:多旋翼飞控实时状态监控与闭环调参中枢

简介:INAV-Configurator_win64_4.0.0.zip 是面向无人机开发者与进阶飞控爱好者的官方图形化配置工具,专为INAV开源飞控固件设计,解决Windows 64位平台下固件刷写、传感器校准、PID调参、GPS/无线模块配置等核心调试难题。资源包共123个文件&a…

2026/10/20 15:43:37 阅读更多 →
RTP扩展头深度解析:从RFC 3550到WebRTC应用与抓包实践

RTP扩展头深度解析:从RFC 3550到WebRTC应用与抓包实践

把 RTP 协议学到第九十篇还在记笔记,这是我自己都没想到的。不过说实话,前面那些内容大多是"标准玩法",固定头、负载类型、时间戳、SSRC、序列号,只要跟过一遍 Wireshark 抓包基本都能弄明白。真正让我花掉两个周末的&a…

2026/10/20 15:42:35 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →