ASP.NET WebForms网站部署到IIS全流程详解与常见问题排查
1. 项目概述从开发到上线的关键一跃做ASP.NET WebForms也就是我们常说的ASPX网站开发的朋友从Visual Studio那个熟悉的调试环境到把网站真正放到服务器上跑起来中间往往隔着一道“部署”的坎。我见过不少新手开发者本地调试一切正常代码逻辑清晰页面交互流畅可一到要部署到IISInternet Information Services上就各种报错404找不到页面、500内部服务器错误、静态文件加载不出来、数据库连接失败……问题层出不穷。其实这个过程本身并不复杂但涉及到的环节和细节很多任何一个地方没配置对都可能让网站“趴窝”。今天我就以一个老司机的视角把ASPX网站部署到IIS的完整流程、核心原理以及那些容易踩坑的细节掰开揉碎了讲给你听。无论你是刚入行的.NET开发者还是需要临时客串运维的开发人员这篇超详细的指南都能帮你把网站稳稳当当地送上服务器。简单来说部署就是把你在本地开发环境Visual Studio IIS Express中运行良好的网站程序、依赖项和配置文件搬运到生产环境的IIS服务器上并正确配置使其能够被外部用户访问。这个过程的核心在于理解IIS如何托管.NET应用程序以及如何确保应用程序池、身份认证、文件权限等关键配置与你的网站需求匹配。接下来我们会从环境准备开始一步步深入到每个配置项的深层逻辑。2. 部署前的核心准备工作在动手部署之前充分的准备工作能避免一半以上的后续问题。这个阶段不是简单地复制文件而是要理清部署目标的环境和你的应用程序的依赖关系。2.1 服务器环境与应用程序梳理首先你需要明确目标服务器。是Windows Server 2012/2016/2019/2022还是Windows 10/11用于开发测试不同系统的IIS版本和功能可能略有差异但核心流程一致。确保服务器上已经安装了对应版本的.NET Framework。你的ASPX网站是基于.NET Framework 4.5、4.7.2还是4.8开发的这必须在服务器上预先安装好。你可以通过服务器管理器或者PowerShell命令Get-ChildItem HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP -Recurse | Get-ItemProperty -Name Version, Release -ErrorAction 0 | Where-Object { $_.PSChildName -match ^(?!S)\p{L}} | Select-Object PSChildName, Version, Release来查看已安装的版本。接下来梳理你的应用程序。在Visual Studio中右键点击项目选择“发布”。但先别急着操作我们来看看发布配置里有什么门道。通常我们需要选择发布目标为“文件系统”配置为“Release”发布模式。发布模式会编译优化代码移除调试符号性能更好也更安全。关键一步是在“设置”里确保“预编译期间删除所有现有文件”被勾选这能防止陈旧的编译文件如App_Web_*.dll残留导致奇怪错误。同时检查“在预编译输出中包含合并的.NET程序集”选项这会将所有引用的DLL除了系统核心库合并到一个或几个DLL中简化部署结构。注意如果你的项目使用了Entity Framework等需要数据库迁移的框架务必确认是否需要在服务器上执行Update-Database命令。对于WebForms项目更常见的是直接使用已有的数据库备份或脚本在服务器上还原数据库。2.2 IIS的安装与必需功能启用如果服务器上还没有IIS需要先安装。在Windows Server上通过“服务器管理器” “添加角色和功能”来安装。在Windows 10/11上则通过“控制面板” “程序” “启用或关闭Windows功能”。安装时不能只勾选默认的Web服务器必须根据ASP.NET应用程序的需要添加以下关键角色服务应用程序开发这是核心。必须勾选.NET Extensibility 3.5、.NET Extensibility 4.8根据你的.NET版本选择、ASP.NET 3.5和ASP.NET 4.8。这确保了IIS能够理解和托管.NET应用程序。安全性建议勾选“Windows身份验证”和“请求筛选”后者用于安全配置。性能静态内容压缩和动态内容压缩可以根据服务器资源情况选择启用有助于减少网络传输量。管理工具务必安装“IIS管理控制台”和“IIS 6管理兼容性”某些旧工具或脚本可能需要。安装完成后打开IIS管理器运行inetmgr你应该能看到一个默认网站。我们的操作将主要在这里进行。3. 发布应用程序与文件系统准备准备工作就绪后我们开始生成部署包。在Visual Studio中完成发布配置后点击“发布”按钮。VS会将编译后的网站文件输出到你指定的文件夹例如bin\Release\PublishOutput。这个文件夹里的内容就是你需要上传到服务器的全部家当。典型的发布输出目录结构如下PublishOutput/ ├── bin/ # 核心包含你编译的程序集(.dll)和引用的第三方库 │ ├── YourWebApp.dll │ ├── YourWebApp.pdb # 调试符号文件生产环境可删除 │ └── Newtonsoft.Json.dll ├── Default.aspx # ASPX页面文件 ├── Default.aspx.cs # 代码后置文件如果未预编译到DLL中 ├── Web.config # 核心配置文件部署后常需修改 ├── Global.asax # 应用程序全局文件 ├── Content/ # 静态资源CSS图片等 │ └── site.css └── Scripts/ # 静态资源JavaScript文件 └── modernizr.js现在你需要将这些文件传输到服务器。可以通过FTP、共享文件夹、远程桌面直接复制或者使用CI/CD工具如Jenkins, Azure DevOps。在服务器上选择一个合适的路径存放网站文件例如D:\WebSites\YourApp。强烈建议不要使用系统盘如C盘的默认inetpub\wwwroot目录将其留给默认网站或测试用途自己的应用放在独立目录便于管理和权限控制。文件传输到服务器后第一件要事就是检查Web.config文件。开发环境和生产环境的配置通常不同尤其是连接字符串。你需要将连接字符串中的服务器地址、数据库名称、用户名和密码修改为生产环境的正确值。此外检查compilation debugtrue在生产环境中必须将其设置为false否则会严重影响性能并暴露敏感信息。4. IIS站点与应用程序池的详细配置这是部署的核心环节IIS通过“站点”和“应用程序池”来隔离和管理不同的Web应用。4.1 创建应用程序池应用程序池是工作进程w3wp.exe的容器它为运行在其中的Web应用提供了独立的内存空间和配置。为你的网站创建一个独立的应用程序池是个好习惯可以避免与其他应用相互影响。在IIS管理器的左侧连接树中右键点击“应用程序池”选择“添加应用程序池”。输入名称如“YourAppPool”。.NET CLR版本选择与你项目匹配的版本例如“.NET CLR版本 v4.0.30319”。对于纯.NET Framework 4.x的项目也可以选择“无托管代码”但通常选择对应版本更稳妥。托管管道模式这是关键选择。集成模式推荐IIS和ASP.NET运行时紧密集成请求处理管道是统一的。这提供了更好的性能、更丰富的功能如对ASP.NET模块的全面支持和更简单的配置例如可以直接在Web.config中配置URL重写、静态文件处理等。对于新项目应首选此模式。经典模式模拟IIS 6.0的行为IIS和ASP.NET有各自独立的管道。只有当你需要兼容一个非常古老、为经典模式设计的应用程序或者某些特定ISAPI过滤器必须在此模式下工作时才选择它。其他高级设置可以设置“回收”条件定期重启工作进程以释放内存、“标识”进程运行的身份默认为ApplicationPoolIdentity这是一个安全的虚拟账户等。4.2 创建网站并绑定在IIS管理器中右键点击“站点”选择“添加网站”。网站名称输入一个描述性名称如“MyAspNetSite”。物理路径指向你上传网站文件的目录如D:\WebSites\YourApp。点击“...”按钮浏览选择务必确保路径正确无误。绑定这是配置网站如何被访问的关键。类型通常为http或https。IP地址如果服务器有多个IP可以指定一个通常选择“全部未分配”监听所有IP。端口HTTP默认是80HTTPS默认是443。如果80端口已被占用如默认网站你需要换一个端口例如8080。此时访问地址就是http://服务器IP:8080。主机名如果你有域名并希望通过域名访问如www.yourdomain.com就在这里填写域名。这通常用于在同一台服务器、同一IP和端口上通过不同域名托管多个网站基于主机头的虚拟主机。创建完成后在左侧树中选中新创建的网站在中间的主窗口中找到“应用程序池”设置将其从默认池更改为你刚刚创建的“YourAppPool”。4.3 将虚拟目录转换为应用程序如果你不是在根目录创建新网站而是想在现有网站比如默认网站下添加一个子应用就需要用到“转换为应用程序”。在IIS管理器中展开父站点右键点击你的应用文件夹虚拟目录。选择“转换为应用程序”。在弹出的对话框中点击“选择...”按钮为这个子应用分配一个独立的应用程序池同样推荐。这样这个子应用就拥有了独立的配置和进程空间。5. 权限配置与安全加固权限问题是导致部署失败的最常见原因之一尤其是“HTTP错误 500.19 - Internal Server Error”或“访问被拒绝”。5.1 IIS_IUSRS与应用程序池标识IIS工作进程需要读取和执行你网站目录下的文件。这个权限是通过用户组或用户账户来控制的。IIS_IUSRS组这是一个内置组包含了所有IIS应用程序池工作进程运行时使用的身份。通常最简单的做法是给你网站的物理目录赋予IIS_IUSRS组“读取和执行”的权限。应用程序池标识更精细的控制方式是使用应用程序池自身的标识。默认的ApplicationPoolIdentity是一个虚拟账户其名称格式为IIS AppPool\YourAppPool。你可以直接给目录赋予这个用户权限。实操步骤在资源管理器中右键点击你的网站目录如D:\WebSites\YourApp选择“属性” - “安全” - “编辑” - “添加”。在对象名称框中输入IIS AppPool\YourAppPool请将YourAppPool替换为你的实际池名点击“检查名称”验证然后确定。在权限列表中勾选“读取和执行”、“列出文件夹内容”、“读取”。通常这就足够了。切勿轻易赋予“完全控制”权限这是严重的安全风险。对于需要上传文件的目录如Uploads你可能需要额外赋予“修改”或“写入”权限但范围应尽可能缩小。5.2 数据库连接权限如果你的应用程序需要连接数据库如SQL Server连接字符串中使用的账户必须在数据库服务器上有相应的登录名和权限如对特定数据库的db_datareader,db_datawriter等。避免在连接字符串中使用sa等高级别账户。最佳实践是创建一个仅具有所需最小权限的专用数据库用户。6. 功能模块配置与常见问题调优基本站点搭建起来后还需要根据应用特性调整一些IIS功能模块的配置。6.1 静态文件处理对于CSS、JS、图片等静态文件需要确保“静态内容”模块已安装且正常工作。在IIS中选中你的网站双击“MIME类型”图标确保常见的文件类型如.woff2,.svg等都有对应的MIME类型否则浏览器可能无法正确加载。通常IIS默认配置是齐全的。6.2 错误页面与详细错误信息为了安全生产环境不应向用户显示详细的ASP.NET错误信息黄页。你可以在网站的“错误页面”功能中为特定HTTP错误代码如404500设置自定义的友好错误页面。同时在Web.config的system.web节中确保customErrors modeOn /是开启的并可以指定默认重定向页面。6.3 URL重写与无扩展名URL如果你的WebForms项目使用了路由ASP.NET Routing或者想实现友好的URL需要确保“URL重写”模块已安装。你可以通过Microsoft Web Platform Installer或直接下载安装包进行安装。安装后重写规则可以配置在Web.config的system.webServer-rewrite节中。6.4 会话状态与进程外存储默认情况下ASP.NET会话状态Session存储在Web服务器进程的内存中。如果使用多台服务器做负载均衡或者希望应用程序池回收时不丢失会话就需要配置进程外会话状态存储。常见选项是使用“ASP.NET状态服务”或“SQL Server会话状态提供程序”。这需要在Web.config的system.web-sessionState节中进行配置。7. 部署后的验证与深度排查完成所有配置后在服务器本机打开浏览器访问http://localhost:端口号或你配置的地址进行测试。如果出现错误不要慌按以下步骤排查检查IIS日志日志位于%SystemDrive%\inetpub\logs\LogFiles下对应站点的目录中。查看最近的日志文件错误信息通常包含HTTP状态码、子状态码和原因短语是定位问题的第一手资料。使用浏览器开发者工具按F12打开查看“网络(Network)”选项卡。刷新页面看哪些请求失败了状态码为4xx或5xx以及具体的错误信息。对于静态文件404检查路径和权限对于ASPX页面500错误进入下一步。查看详细的ASP.NET错误为了调试可以临时在Web.config中设置customErrors modeOff/和compilation debugtrue调试后切记改回并重启应用程序池。这样错误黄页会显示堆栈跟踪和错误行号是定位代码级问题的利器。检查事件查看器Windows的“事件查看器”中“Windows日志” - “应用程序”里常常记录了来自ASP.NET或IIS的更详细的崩溃和异常信息。应用程序池状态确认你的应用程序池是“正在运行”状态。有时池可能会意外停止手动启动一下。一个典型问题排查实录问题访问网站根目录显示403.14 - Forbidden目录列表被拒绝但访问具体aspx页面却报404.0 - Not Found。 排查403.14说明IIS找到了目录但默认文档如Default.aspx未配置或不存在。去网站“默认文档”功能中添加Default.aspx。添加后仍报404.0说明IIS无法处理.aspx扩展名。这几乎可以肯定是ASP.NET功能未在IIS中正确注册或启用。解决方案以管理员身份打开命令提示符运行%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i根据你的.NET版本选择Framework或Framework64路径。这个命令会向IIS注册ASP.NET并确保处理程序映射正确。8. 进阶考量与性能优化当网站能够正常运行后我们可以考虑一些进阶配置来提升安全性、可靠性和性能。8.1 启用HTTPS与绑定SSL证书在现代Web环境中启用HTTPS是必须的。你需要获取一个SSL证书可以从证书颁发机构购买或使用Let‘s Encrypt等免费服务生成。在IIS中在服务器节点下打开“服务器证书”功能导入你的证书.pfx文件。回到网站绑定添加一个类型为https的新绑定端口443并选择你导入的SSL证书。可以考虑使用“URL重写”模块创建规则强制将所有的HTTP请求重定向到HTTPS确保通信安全。8.2 应用程序池的优化设置回收设置特定时间如凌晨低峰期或基于内存/请求数的条件进行回收可以定期释放资源但会导致回收期间第一个请求变慢冷启动。可以设置“重叠回收”来减轻影响。启动模式设置为AlwaysRunning需要IIS 7.5并在网站配置中设置preloadEnabled”true”可以实现应用程序预加载避免第一个用户的冷启动延迟。标识如果应用需要访问网络资源或其他特定权限可以考虑将应用程序池标识更改为一个具有相应权限的域用户或本地用户而非默认的虚拟账户但这会增加安全管理的复杂性。8.3 输出缓存与压缩输出缓存对于不常变化的页面如关于我们、帮助页面可以在Web.config或页面指令中设置输出缓存显著降低服务器负载。压缩在IIS中启用“静态内容压缩”和“动态内容压缩”可以减小传输文件的大小提升页面加载速度尤其对移动用户友好。将ASP.NET WebForms网站部署到IIS是一个将开发成果交付给最终用户的标准流程。它考验的不仅是点击配置的技能更是对IIS架构、.NET运行时、Windows安全体系以及网络基础的综合理解。我个人的经验是建立一个标准化的部署检查清单非常有用每次部署都按清单核对一遍环境、配置、权限和依赖项能极大减少人为失误。另一个小技巧是在服务器上针对你的网站目录建立一个简单的test.html文件里面只写“Hello World”然后通过浏览器访问它。如果这个静态文件能访问但aspx页面不能那问题就基本锁定在ASP.NET处理程序或应用程序池配置上如果静态文件也不能访问那问题就是IIS站点绑定、端口或文件权限等更基础的层面。这种分而治之的排查思路往往能帮你快速定位问题根源。

相关新闻

程序员如何驾驭AI实现能力跃迁:从执行者到解决方案架构师

程序员如何驾驭AI实现能力跃迁:从执行者到解决方案架构师

1. 项目概述:当AI成为你的新同事最近和几个老同事吃饭,聊得最多的就是“AI会不会把我们给优化了”。从去年开始,各种代码生成工具、智能助手层出不穷,从帮你写注释到直接生成一个功能模块,效率高得吓人。很多初级程序员…

2026/10/3 21:21:08 阅读更多 →
数值转换全解析:从基础概念到跨系统实战避坑指南

数值转换全解析:从基础概念到跨系统实战避坑指南

1. 项目概述:从“数”到“值”的桥梁干了这么多年数据处理和系统开发,我越来越觉得,很多看似复杂的技术问题,根源往往在于一些基础概念的模糊。今天想聊的“数值转换”,就是这样一个典型。乍一听,这词儿好像…

2026/10/12 3:41:09 阅读更多 →
Meta开源轻量多模态模型Muse Glimmer:本地部署与实战指南

Meta开源轻量多模态模型Muse Glimmer:本地部署与实战指南

如果你最近关注AI开源社区,可能会注意到一个现象:大模型领域的“军备竞赛”似乎正在从单纯的参数规模,转向一个更务实、更让开发者兴奋的方向—— 轻量化、可部署、能直接跑在消费级硬件上的高质量模型 。就在几天前,Meta再次投…

2026/10/4 21:12:11 阅读更多 →

最新新闻

Sufer 8.0英文版等值线图实战:从散点插值到批量出图的完整避坑指南

Sufer 8.0英文版等值线图实战:从散点插值到批量出图的完整避坑指南

简介:Surfer 8.0英文版是Golden Software公司推出的专业地形图绘制与三维建模软件,面向地质、环境科学、工程及地球科学领域的从业者与学习者,用于将离散数据转化为连续格网表面并生成专业图件。压缩包共234个文件,约12.41MB&…

2026/10/13 20:10:07 阅读更多 →
校园外卖系统数据库课设实战:三端闭环与状态机设计

校园外卖系统数据库课设实战:三端闭环与状态机设计

简介:本资源是一套完整的微信小程序校园外卖系统课程设计实践项目,面向高校数据库原理与应用、Web前端开发及小程序实战类课程的学生与教师,解决课程设计中缺乏真实业务场景、前后端协同与数据库建模结合案例的问题。压缩包共123个文件&#…

2026/10/13 20:10:07 阅读更多 →
二值图中心线提取实战:从细化算法到毛刺修剪与亚像素优化

二值图中心线提取实战:从细化算法到毛刺修剪与亚像素优化

做图像处理开发的朋友,十有八九都碰到过这类需求:从一张二值图里,把细长目标的中心线稳定地提出来。PCB走线、打印字符的笔画中心、纤维或者线缆的轴线,甚至医学影像里的血管路径,本质上都是同一个问题。最直觉的方案是…

2026/10/13 20:10:07 阅读更多 →
布匹瑕疵数据集-2019天池:工业表面检测小目标与低对比度缺陷基准

布匹瑕疵数据集-2019天池:工业表面检测小目标与低对比度缺陷基准

简介:本资源为2019年天池平台发布的布匹表面瑕疵检测专项数据集,面向计算机视觉方向的初学者与工业质检算法研究者,适用于缺陷识别、目标检测模型训练与小样本学习等实践场景。压缩包共935个文件,含689张JPG格式布匹瑕疵图像&…

2026/10/13 20:10:07 阅读更多 →
STM32F407ZG智能门锁实战:矩阵键盘+OLED+蓝牙+舵机全链路实现

STM32F407ZG智能门锁实战:矩阵键盘+OLED+蓝牙+舵机全链路实现

简介:本资源是一套基于STM32F407ZGT6的智能门锁完整嵌入式开发项目,面向电子/自动化/物联网方向本科生及毕业设计学生,聚焦密码验证、本地交互与蓝牙远程控制三大核心功能,切实解决毕业设计中硬件选型、多外设协同与系统集成等典型…

2026/10/13 20:10:07 阅读更多 →
PS5串流实战指南:从局域网到外网的远程游戏配置与延迟优化

PS5串流实战指南:从局域网到外网的远程游戏配置与延迟优化

直接接PS5玩家一个很现实的问题:这台机器买回来之后,是不是基本就长在客厅电视柜上了?客厅被占、卧室想玩、出差想刷两把,每次都只能乖乖回到电视前。我捣鼓AnyPS5这套串流方案,就是为了把这台主机从HDMI线的长度里解放…

2026/10/13 20:09:06 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战: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/12 21:05:09 阅读更多 →
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 阅读更多 →