Nginx HTTPS证书配置实战:从证书链缺失到完整解决方案
1. 项目概述从一次深夜告警说起那天晚上十一点半手机突然弹出一条告警“服务SSL证书即将过期”。作为运维这种告警见怪不怪我熟练地登录服务器准备更新证书。我们的服务架构很简单前端用Nginx做反向代理和HTTPS卸载后端是几个微服务。按照标准流程我从证书颁发机构拿到了新的.crt和.key文件替换了旧的然后优雅地重启了Nginx。nginx -t测试配置语法完美通过systemctl reload nginx也显示成功。我刷新了一下浏览器满心以为会看到那个绿色的小锁结果却是一个刺眼的红色警告“您的连接不是私密连接”。心里“咯噔”一下得又踩坑了。这个场景相信不少负责过Web服务部署和运维的朋友都遇到过。配置HTTPS尤其是使用Nginx看似是基础操作但其中涉及的细节和可能遇到的“坑”却不少。从证书链不完整、权限问题到配置指令的细微差别任何一个环节出问题都可能导致HTTPS无法正常工作轻则影响用户体验重则导致服务中断。今天我就来详细拆解一下我在这次“Nginx配置HTTPS证书”过程中遇到的那个具体问题以及如何系统性地排查和解决这类问题。无论你是刚接触服务器部署的新手还是有一定经验的开发者希望这篇从实战中总结的笔记能帮你绕过我踩过的那些坑。2. 问题现象与初步排查当优雅重启失效之后遇到浏览器报错我的第一反应不是盲目修改配置而是先进行系统性的现象收集。盲目操作只会让问题更复杂。2.1 多维度现象确认首先我确认了问题不是孤例。在不同的电脑、不同的浏览器Chrome, Firefox甚至手机上访问都出现了同样的安全警告。这排除了本地浏览器缓存或插件干扰的可能性。错误信息在Chrome中通常是“NET::ERR_CERT_AUTHORITY_INVALID”或“ERR_CERT_INVALID”核心意思是浏览器不信任我服务器提供的证书。接着我使用命令行工具进行更底层的检查。最直接的就是openssl命令openssl s_client -connect yourdomain.com:443 -servername yourdomain.com这个命令会模拟一个SSL/TLS客户端连接到你的服务器并打印出详尽的握手信息。执行后我重点关注了输出末尾的几行Verify return code: 20 (unable to get local issuer certificate)这个返回码“20”是个关键线索它通常意味着证书链不完整。服务器没有把中间证书Intermediate Certificate正确地发送给浏览器导致浏览器无法沿着信任链追溯到它信任的根证书Root Certificate。同时我也用了curl进行快速测试curl -vI https://yourdomain.com在输出中curl可能会在尝试SSL握手时失败并给出类似“SSL certificate problem: unable to get local issuer certificate”的错误。2.2 Nginx状态与日志分析确认是SSL握手问题后我回过头检查Nginx本身的状态。虽然reload成功了但并不意味着新的配置就一定被完美应用。我查看了Nginx的错误日志路径通常是/var/log/nginx/error.log。tail -f /var/log/nginx/error.log然后再次访问网站观察是否有新的错误产生。一个常见的、与证书相关的错误是SSL_CTX_use_PrivateKey_file(“/path/to/your.key”) failed (SSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch)这个错误非常明确证书文件与私钥文件不匹配。这意味着我可能误用了不同密钥对生成的证书或者文件在传输过程中损坏了。注意nginx -t只检查配置文件的语法正确性它不会去验证你指定的证书文件和私钥文件是否真实存在、格式是否正确、以及它们是否彼此匹配。因此语法检查通过绝不代表SSL配置就能正常工作。3. 核心问题深挖证书链缺失的来龙去脉经过初步排查焦点集中在了“证书链不完整”上。这可以说是Nginx配置HTTPS时最高频的问题之一。要理解它我们得先简单回顾一下证书信任链。3.1 证书信任链原理简述证书颁发机构CA为了安全和管理方便通常采用三级结构根证书Root CA自签名证书预埋在操作系统和浏览器的信任存储中。它几乎不直接签发终端用户证书。中间证书Intermediate CA由根证书签发用于签发终端用户证书。CA会提供这个证书。服务器证书Server Certificate也就是你为域名申请的证书由中间证书签发。当浏览器访问你的网站时你需要将服务器证书和中间证书一起发给它。浏览器会用你提供的中间证书去验证服务器证书的签名再用自己信任存储里的根证书去验证中间证书的签名从而建立完整的信任链。如果你只发送了服务器证书浏览器找不到上一级的签发者验证就会失败。3.2 Nginx配置中的关键指令在Nginx中与证书链相关的配置指令主要是ssl_certificate和ssl_certificate_key。server { listen 443 ssl http2; server_name yourdomain.com; ssl_certificate /etc/nginx/ssl/yourdomain.com.crt; ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key; # ... 其他SSL配置 }问题就出在ssl_certificate这个指令的理解上。很多人包括最初的我认为这个指令只需要指向我们申请到的那个域名证书文件例如yourdomain_com.crt。但实际上最佳实践是这个文件应该是一个“证书包”即你的服务器证书和中间证书合并后的文件。CA在颁发证书时通常会提供两个文件yourdomain_com.crt你的服务器证书ca_bundle.crt或类似名称中间证书链你需要将它们合并成一个文件。合并的顺序是你的服务器证书在前中间证书在后。在Linux下可以使用cat命令cat yourdomain_com.crt ca_bundle.crt combined.crt然后在Nginx配置中将ssl_certificate指向这个新生成的combined.crt文件。3.3 我踩中的那个“坑”自动化脚本的盲区那么我这次的问题是怎么产生的呢原因在于我们的证书更新流程是半自动化的。我们使用了一个流行的自动化证书管理工具例如Certbot来申请和续期Let‘s Encrypt证书。这个工具默认会处理好证书链它生成的fullchain.pem文件就是合并好的证书链。然而这次我们的证书并非来自Let‘s Encrypt而是从另一个商业CA手动申请的。我写了一个部署脚本脚本的逻辑是从CA的邮件中下载两个附件server.crt和intermediate.crt。用server.crt覆盖Nginx配置指向的旧证书文件。重启Nginx。问题在于我的脚本只拷贝了服务器证书完全忽略了中间证书文件。Nginx配置指向的始终是一个只有服务器证书的文件。在证书续期时旧证书链可能还在浏览器缓存中工作一旦换成新的、不完整的证书问题立刻暴露。实操心得无论证书来源是自动还是手动在部署后一定要用openssl s_client或在线SSL检测工具如SSL Labs’s SSL Test验证证书链是否完整。这是上线前必不可少的一步。4. 系统性解决方案与配置优化解决了这个具体的证书链问题后我决定重新梳理并优化整个Nginx HTTPS配置流程避免未来再犯类似错误。4.1 完整的证书文件准备流程我建立了一个标准操作程序SOP获取文件从CA获取两个文件服务器证书通常以域名命名如domain.crt和中间证书链文件常被称为CA-Bundle.crt,intermediate.crt等。验证文件可选但推荐验证私钥openssl rsa -in domain.key -check验证证书openssl x509 -in domain.crt -text -noout验证匹配性openssl x509 -noout -modulus -in domain.crt | openssl md5和openssl rsa -noout -modulus -in domain.key | openssl md5。两个命令输出的MD5值必须完全一致。合并证书链创建一个合并文件例如domain.chained.crt。# 顺序至关重要先你的证书后中间证书 cat domain.crt CA-Bundle.crt domain.chained.crt设置权限确保私钥文件.key权限为600仅所有者可读写并且所有者是Nginx进程的运行用户通常是nginx或www-data。chmod 600 domain.key chown nginx:nginx domain.key证书文件.crt或.pem权限可以宽松一些如644。4.2 Nginx SSL配置模板与详解以下是我现在使用的强化版Nginx SSL配置模板并附上了关键参数的解释server { listen 443 ssl http2; # 启用HTTP/2提升性能 listen [::]:443 ssl http2; # IPv6 server_name yourdomain.com www.yourdomain.com; # 1. 证书配置指向合并后的链文件 ssl_certificate /etc/nginx/ssl/yourdomain.chained.crt; ssl_certificate_key /etc/nginx/ssl/yourdomain.key; # 2. SSL会话优化 ssl_session_timeout 1d; # 客户端可以复用SSL会话参数的时间降低握手开销 ssl_session_cache shared:SSL:50m; # 设置共享会话缓存50MB大约可缓存8万个会话 ssl_session_tickets off; # 对于多服务器负载均衡场景建议关闭session tickets改用共享缓存 # 3. 加密套件与协议配置安全与兼容性平衡 ssl_protocols TLSv1.2 TLSv1.3; # 禁用不安全的TLSv1.0和TLSv1.1 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; # 优先使用前向保密的ECDHE套件 ssl_prefer_server_ciphers on; # 由服务器决定使用哪个加密套件 # 4. 安全增强头部分需在后端应用或Nginx其他位置设置 add_header Strict-Transport-Security “max-age63072000; includeSubDomains; preload” always; # HSTS强制浏览器使用HTTPS add_header X-Frame-Options SAMEORIGIN always; # 防止点击劫持 add_header X-Content-Type-Options nosniff always; # 防止MIME类型嗅探 # 5. 根目录与其他配置 root /var/www/yourdomain; index index.html index.htm; location / { try_files $uri $uri/ 404; } # 6. 可选将HTTP流量重定向到HTTPS } server { listen 80; server_name yourdomain.com www.yourdomain.com; return 301 https://$server_name$request_uri; }关键点解析ssl_certificate现在它明确指向了合并后的chained.crt文件一劳永逸地解决了链问题。ssl_session_cache设置为shared在所有worker进程间共享比built-in更高效尤其在高并发场景下能显著减少CPU消耗。ssl_ciphers这里列出的是一组经过挑选的、支持前向保密Forward Secrecy的现代加密套件。前向保密意味着即使服务器的私钥未来被泄露过去的通信记录也无法被解密。你可以使用 Mozilla SSL Configuration Generator 这个在线工具根据你的兼容性需求生成推荐的配置。4.3 配置测试与生效修改配置后必须执行严格的测试流程测试语法nginx -t。这依然是第一步确保没有语法错误。测试SSL配置使用openssl s_client命令观察握手是否成功以及返回的证书链是否完整。可以特别检查证书链深度openssl s_client -connect yourdomain.com:443 -showcerts这个命令会显示服务器发送的所有证书。你应该能看到至少两个BEGIN CERTIFICATE块。在线工具验证访问 SSL Labs (https://www.ssllabs.com/ssltest/)输入你的域名进行全面的安全扫描。它会给出评分并明确指出证书链、协议支持、加密套件等所有细节问题。优雅重启测试无误后使用systemctl reload nginx或nginx -s reload让配置生效。reload是平滑重启不会中断正在处理的连接。5. 其他常见问题与排查清单证书链问题只是冰山一角。下面我整理了一个更全面的Nginx HTTPS配置问题排查清单你可以像查字典一样使用它。5.1 问题速查表问题现象可能原因排查命令/方法浏览器报“证书无效”或“私密连接错误”1. 证书链不完整2. 证书与域名不匹配3. 证书已过期1.openssl s_client -showcerts2. 检查证书Subject Alternative Name字段3.openssl x509 -in file.crt -noout -datesNginx启动或reload失败1. 证书与私钥不匹配2. 私钥文件权限过宽3. 配置文件语法错误1. 对比证书和私钥的MD5模数2.ls -l /path/to/key检查是否为6003.nginx -t查看具体错误行SSL握手缓慢1. 未启用会话缓存2. 使用了不支持硬件加速的加密套件1. 检查ssl_session_cache配置2. 考虑使用支持AES-NI等指令集的套件特定浏览器/旧设备无法访问1. 禁用了过旧的协议如TLSv1.02. 加密套件太新旧设备不支持1. 检查ssl_protocols2. 使用SSL Labs测试兼容性适当调整ssl_ciphersHTTP/2不工作1. 监听端口未明确启用http22. 使用了不兼容HTTP/2的Nginx模块或配置1. 检查listen 443 ssl http2;2. 查阅Nginx官方文档中关于HTTP/2的模块兼容性说明5.2 深度排查技巧对于上表中列出的问题这里有一些更深入的排查思路针对“证书与私钥不匹配” 这是最致命也最容易检查的错误。除了用上面提到的openssl命令对比模数一个更直观的方法是尝试用私钥对证书进行验证# 如果这条命令不报错则说明匹配 openssl x509 -noout -pubkey -in yourdomain.crt | openssl rsa -pubin -outform der | openssl dgst -sha256 # 需要与私钥的公钥部分对比但更简单的是直接用匹配性检查命令实际上在部署前养成用openssl verify -CAfile ca-bundle your-cert验证证书链以及用匹配性检查命令验证密钥对的好习惯能节省大量故障排查时间。针对“SSL握手缓慢” 启用并优化ssl_session_cache是提升性能的关键。对于拥有多个Nginx服务器如负载均衡集群的情况ssl_session_tickets off;并配合共享缓存如使用memcached或redis存储会话是更专业的解决方案。此外确保系统安装了最新的OpenSSL库以支持TLS 1.3TLS 1.3的握手速度比TLS 1.2有显著提升。针对兼容性问题 平衡安全与兼容是一门艺术。如果你必须支持非常老的客户端如Android 4.x你可能需要将ssl_protocols暂时包含TLSv1但请注意安全风险并在ssl_ciphers列表中加入一些较老的、但尚可接受的套件。更好的做法是通过用户代理User-Agent检测将老旧客户端的流量引导至一个专门配置了兼容性选项的服务器或位置块location中。这需要更复杂的配置但能兼顾安全与用户体验。6. 进阶考量与最佳实践当单个站点的HTTPS配置稳定后面对多域名、高性能或高安全需求场景还有更多可以优化的地方。6.1 多域名与泛域名证书配置如果你有多个域名或子域名使用多域名证书SAN证书或泛域名证书Wildcard Certificate可以简化管理。配置上与单域名证书基本一致关键在于Nginx的server_name指令要能正确匹配。# 泛域名证书配置示例 server { listen 443 ssl http2; server_name ~^(?subdomain.)\.yourdomain\.com$; # 使用正则匹配所有子域名 ssl_certificate /etc/nginx/ssl/wildcard.yourdomain.chained.crt; ssl_certificate_key /etc/nginx/ssl/wildcard.yourdomain.key; # ... 其他配置可以根据$subdomain变量进行差异化处理 }注意泛域名证书的私钥一旦泄露所有子域名都将不安全因此其保管需要格外严格。6.2 性能调优要点启用OCSP StaplingOCSP在线证书状态协议用于实时检查证书是否被吊销。默认情况下浏览器需要额外向CA的OCSP服务器发起查询这会增加延迟。OCSP Stapling允许Nginx预先从CA获取OCSP响应并在TLS握手时一并发送给浏览器省去了浏览器的查询步骤。ssl_stapling on; ssl_stapling_verify on; # 需要配置一个DNS解析器用于查询OCSP服务器 resolver 8.8.8.8 1.1.1.1 valid300s; resolver_timeout 5s;配置后使用openssl s_client -connect yourdomain.com:443 -status命令检查输出中看到OCSP Response Status: successful即表示成功。调整缓冲区大小对于高流量网站适当增大SSL缓冲区可以改善性能但会略微增加内存消耗。ssl_buffer_size 16k; # 默认是16k对于大响应可能偏小可尝试调整为32k或64k使用TLS 1.3在Nginx 1.13.0及以上版本OpenSSL 1.1.1及以上版本中确保ssl_protocols包含TLSv1.3。TLS 1.3的握手更快通常只需1个RTT且废弃了不安全的加密算法安全性更高。6.3 安全加固建议禁用弱协议和套件坚决禁用SSLv2, SSLv3, TLSv1.0, TLSv1.1。在ssl_ciphers列表中移除所有不含前向保密Forward Secrecy的套件例如以RSA开头的静态密钥交换套件。设置强DH参数如果为了兼容性必须支持使用DHE密钥交换的加密套件需要生成一个强大的、独有的Diffie-Hellman参数文件避免使用常见的、可能被预计算的参数。openssl dhparam -out /etc/nginx/dhparam.pem 4096 # 生成4096位的DH参数较耗时然后在Nginx配置中引用ssl_dhparam /etc/nginx/dhparam.pem;定期更新与扫描定期更新Nginx和OpenSSL到稳定版本以修复安全漏洞。定期使用类似SSL Labs的扫描工具检查配置确保其符合当前的安全最佳实践。那次深夜的证书故障最终花费了我近一个小时才定位到是证书链文件缺失这个“简单”问题。但正是这次经历促使我建立起一套标准的证书部署和验证流程。运维工作就是这样大部分时间都在处理那些看似微不足道、但一旦忽略就会引发生产事故的细节。把每一次踩坑都变成优化流程、完善文档的机会系统才会越来越稳定。现在我们的部署脚本里已经强制加入了证书链合并和openssl s_client验证的步骤同样的错误再也没有发生过。

相关新闻

Android开发入门实战:从环境搭建到首个交互应用构建

Android开发入门实战:从环境搭建到首个交互应用构建

1. 项目概述:为什么现在学Android开发依然有价值? 最近在技术社区里,看到不少关于“Android开发是不是凉了”的讨论。作为一个从Android 2.3时代一路走过来的老码农,我的看法是:远没到凉的时候,只是门槛和玩…

2026/10/17 11:41:43 阅读更多 →
GPT Plus / Pro 使用前,账号与状态信息怎么核对?别只看功能差异

GPT Plus / Pro 使用前,账号与状态信息怎么核对?别只看功能差异

很多朋友拿到一个能登录的账号,目光很容易就被 Plus 和 Pro 的功能对比吸引过去。这确实很直观,但可能忽略了一个更基础的问题:当前登录的到底是谁的账号?页面状态是否真的对应你想要的工具? 这些信息没确认清楚&#…

2026/10/17 14:12:42 阅读更多 →
20260801-05-职业发展-数字孪生工程师薪资报告

20260801-05-职业发展-数字孪生工程师薪资报告

数字孪生工程师薪资报告:2026年行情分析与求职指南 前言 2026年数字孪生行业蓬勃发展,人才需求旺盛。本文基于最新市场数据,为你分析数字孪生工程师的薪资行情和求职建议。 一、薪资行情 1.1 总体水平 级别月薪范围年薪范围占比初级&#xff…

2026/10/16 15:14:50 阅读更多 →

最新新闻

计算机网络面试高频考点:三次握手、DNS解析与HTTP缓存全梳理

计算机网络面试高频考点:三次握手、DNS解析与HTTP缓存全梳理

简介:面向技术面试准备的计算机基础知识点 PDF 文档,重点覆盖计算机网络中的高频考点,与“代码随想录知识星球”最强八股文系列的计算机基础篇对应,适合后端、前端开发者跳槽或校招前集中复习。内容系统梳理了TCP三次握手与四次挥…

2026/10/18 9:41:33 阅读更多 →
计算机网络面试高频考点:三次握手、TCP连接、HTTP缓存与DNS解析

计算机网络面试高频考点:三次握手、TCP连接、HTTP缓存与DNS解析

简介:这是一份面向后端、前端岗位求职者的计算机基础面试资料,内容源自代码随想录知识星球最强八股文系列的计算机基础篇。资源以单个PDF文件呈现,大小约37.83MB,排版紧凑、便于离线阅读或打印对照。PDF围绕计算机网络高频考点展开…

2026/10/18 9:41:33 阅读更多 →
期权Alpha从哪里来?量化捕捉与风控框架全解析

期权Alpha从哪里来?量化捕捉与风控框架全解析

Option Alphas 系列写到第四章,终于到了收尾总结。前三章分别拆了期权定价、波动率曲面、单腿与价差策略的底层逻辑,这一章我想换个角度:把所有零散的认知收拢到一条主线上——期权交易里的 Alpha 到底是什么、从哪里来、怎么稳定地把 Ta 装进…

2026/10/18 9:41:33 阅读更多 →
显存带宽与KV Cache:为什么8GB显存跑不动7B大模型

显存带宽与KV Cache:为什么8GB显存跑不动7B大模型

1. 显存不是“显卡内存”那么简单:从GPU架构看为什么8GB显存跑不动7B模型很多人第一次尝试本地运行大语言模型时,都会被一个反直觉的现象击中:手头明明是RTX 4090(24GB显存)或甚至A100(40GB)&am…

2026/10/18 9:41:32 阅读更多 →
Agent记忆系统设计:短期对话管理与长期向量存储的完整实践指南

Agent记忆系统设计:短期对话管理与长期向量存储的完整实践指南

最近在做Agent相关的一个项目,被问得最多的一个问题就是:“我的机器人一聊长就忘,前面说过的事后面全不记得,这记忆到底怎么设计?”我一看,很多人是把所有对话历史一股脑塞进Prompt,塞到报错&am…

2026/10/18 9:41:32 阅读更多 →
前端任务进度卡0/1:三个静默失败点的定位与工程修复

前端任务进度卡0/1:三个静默失败点的定位与工程修复

1. 现象确认:任务卡在 0/1,但不是没跑先说明一下背景。我这边内部效率工具里有一个叫 WorkBuddy 的模块,每天会推一批小任务,其中有一个“探索优秀灵感”的任务,规则是:从推荐卡片里点开一篇内容&#xff0…

2026/10/18 9:40:32 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →