粗心大意必酿大祸,记录nginx配置文件的一次闹剧

简介: 本文记录一次因 Nginx `server_name` 配置疏漏导致的 HTTPS 访问失败问题:为新域名 `bugfix.wiki` 复制配置时,未在 443 server 块中包含 `www.bugfix.wiki`,致使 SNI 匹配失败、证书不匹配而报错。强调 HTTPS 下 `server_name` 必须覆盖所有访问域名,复制配置需严格核对。

一次域名配置引发的 Nginx 配置问题:HTTPS 与 server_name 的踩坑记录

在最近的项目维护中,我新增了一个域名 bugfix.wiki,计划将其解析到现有的网站上,与之前使用的 bugshare.cn 一样,通过 Nginx 实现完整的 HTTP/HTTPS 跳转逻辑。

域名备案、DNS、SSL 证书均已配置完毕,本以为只需复制一份现有配置即可。结果上线后却发现:bugfix.wiki 无法正常访问,而 bugshare.cn 却完全正常

问题的根源最终被定位在一个非常细微但关键的 Nginx 配置点上。这里记录整个过程,供日后参考,也供遇到相同问题的同学排查。


1. 预期目标

对两个域名(bugshare.cnbugfix.wiki)都希望实现如下行为:

输入 URL 预期跳转
http://domain https://www.domain
http://www.domain https://www.domain
https://domain https://www.domain
https://www.domain 内容正常访问

即:

  • 全站 HTTPS
  • 全站强制“带 WWW”
  • 所有 HTTP 统一跳转到 HTTPS

2. 初始配置(bugshare.cn)——正常工作

bugshare.cn 的配置如下,可以正常运行:

server {
   
    listen 80;
    listen [::]:80;
    server_name bugshare.cn www.bugshare.cn;
    return 301 https://www.bugshare.cn$request_uri;
}

server {
   
    listen 443 ssl;
    server_name bugshare.cn;

    ssl_certificate     /etc/nginx/conf.d/cert/bugshare.cn.pem;
    ssl_certificate_key /etc/nginx/conf.d/cert/bugshare.cn.key;

    if ($host = 'bugshare.cn') {
   
        return 301 https://www.bugshare.cn$request_uri;
    }

    location / {
   
        root /usr/local/nginx/html/dist;
        if ($uri = '/index.html') {
   
            add_header Cache-Control "no-cache, no-store, must-revalidate";
        }
        try_files $uri $uri/ /index.html;
    }
}

注意:该配置虽然也存在优化空间,但在实际场景中运行完全正常。


3. 为 bugfix.wiki 复制一份配置后 —— 访问异常

为新域名复制后:

server {
   
    listen 80;
    listen [::]:80;
    server_name bugfix.wiki www.bugfix.wiki;
    return 301 https://www.bugfix.wiki$request_uri;
}

server {
   
    listen 443 ssl;
    server_name bugfix.wiki;   # ← 问题所在

    ssl_certificate     /etc/nginx/conf.d/cert/bugfix.wiki.pem;
    ssl_certificate_key /etc/nginx/conf.d/cert/bugfix.wiki.key;

    if ($host = 'bugfix.wiki') {
   
        return 301 https://www.bugfix.wiki$request_uri;
    }

    location / {
   
        root /usr/local/nginx/html/dist;
        if ($uri = '/index.html') {
   
            add_header Cache-Control "no-cache, no-store, must-revalidate";
        }
        try_files $uri $uri/ /index.html;
    }
}

访问现象:

表面上跳转逻辑没问题,但最终 HTTPS 访问失败。


4. 问题定位:未将 www.bugfix.wiki 写入 HTTPS server_name

导致报错的关键配置问题:

server_name bugfix.wiki;

缺少了:

www.bugfix.wiki

为什么这是致命错误?

Nginx 在处理 HTTPS 时,会根据 SNI(Server Name Indication) 判断应该使用哪个 server 块及对应的 SSL 证书。

当访问 https://www.bugfix.wiki 时:

  • 浏览器会发送 TLS ClientHello,附带 SNI:www.bugfix.wiki
  • Nginx 根据 server_name 匹配 server 块
  • 此时配置中没有匹配 www.bugfix.wiki 的 443 server
  • Nginx fallback 到默认的 443 server(通常是第一个匹配到的)
  • 返回了不匹配的 SSL 证书 → 浏览器报错

现象表现为“网页无法正常运作”,实际是 SSL 证书不匹配导致连接被拒绝。


5. 修复后的正确配置

server {
   
    listen 443 ssl;
    server_name bugfix.wiki www.bugfix.wiki;

    ssl_certificate     /etc/nginx/conf.d/cert/bugfix.wiki.pem;
    ssl_certificate_key /etc/nginx/conf.d/cert/bugfix.wiki.key;

    if ($host = 'bugfix.wiki') {
   
        return 301 https://www.bugfix.wiki$request_uri;
    }

    location / {
   
        root /usr/local/nginx/html/dist;
        if ($uri = '/index.html') {
   
            add_header Cache-Control "no-cache, no-store, must-revalidate";
        }
        try_files $uri $uri/ /index.html;
    }
}

重启 Nginx:

nginx -s reload

问题即刻解决,所有访问路径完全正常。


6. 技术总结(关键要点)

✔ 1. server_name 必须覆盖 HTTPS 下的所有访问域名

尤其是:

  • 主域名(Apex domain)
  • 带 www
  • 子域名(如有)

否则 SNI 匹配失败,证书无法正确绑定。


✔ 2. Nginx 的域名匹配与“回源域名”无关

即使使用了 Cloudflare 等代理平台,只要请求最终到达 Nginx,SNI 匹配仍完全依赖 Nginx 的 server_name


✔ 3. HTTPS 的 server 块一定比 HTTP 更严格

HTTP 没有 SNI,匹配宽松得多;
HTTPS 要求精确匹配 server_name,否则证书直接错乱。


✔ 4. 强烈建议使用统一跳转逻辑的最佳实践:

server_name bugfix.wiki www.bugfix.wiki;

避免遗漏。

甚至可以进一步做:

server_name .bugfix.wiki;

但需要根据实际情况决定。


7. 后记

整个问题看似隐蔽,其实本质是:

HTTPS server_name 少写了一个域名,导致 SNI 匹配失败。

属于 Nginx 配置中非常常见但又不容易第一时间想到的坑。

像这种“复制配置”场景,非常容易疏忽,提醒自己与大家:

复制配置永远不能无脑复制,尤其是 SSL 相关的 server 块。检查、检查、再检查。

目录
相关文章
|
3月前
|
人工智能 Linux API
【最全】OpenClaw保姆级部署步骤(阿里云/Win11/MacOS/Linux)+必装SKill清单+FAQ,让AI成为全能助手!
“OpenClaw只是个框架,真正让它变强的是Skills”——这是无数用户的实战心得。2026年ClawHub技能市场持续扩容,但多数用户仍面临“选技能难、用技能乱”的困境:要么找不到适配场景的工具,要么安装后不知如何发挥价值。参考文章作者从数据分析、文件管理、视频处理等核心场景出发,精选出一批高实用度技能,用真实案例验证了“装对技能=效率翻倍”的核心逻辑。
744 5
|
2月前
|
IDE Java 开发工具
Eclipse 2025 开发环境(IDE)安装教程:JDK配置+自定义路径+汉化详解(64位)
Eclipse是开源IDE框架,支持插件扩展。本文详解Eclipse 2025安装流程:先解压并以管理员身份安装JDK 23,再运行Setup安装器,选择Java开发版、自定义路径后完成安装;可选清华镜像汉化,重启即享中文界面。(239字)
|
3月前
|
人工智能 缓存 C#
C# 后端集成 CodeBuddy CLI 实战指南
本文详解C#后端集成CodeBuddy CLI的实战方案,基于分层架构(契约层/工厂层/实现层/ACP基础设施层),通过Stdio+JSON-RPC实现进程通信,支持流式/非流式调用与多AI Provider灵活切换,已在开源项目HagiCode中落地验证。(239字)
713 1
|
5月前
|
Kubernetes 应用服务中间件 API
应对 Nginx Ingress 退役,是时候理清这些易混淆的概念了
本文希望提供一种更简单的方式,来理解这些容易混淆的技术概念:Nginx、Ingress、Ingress Controller、Ingress API、Nginx Ingress、Higress、Gateway API。
2648 162
|
2月前
|
弹性计算 人工智能 测试技术
2026年最新阿里云服务器租用收费价格:ECS、轻量、GPU云服务器活动价格参考
2026年阿里云服务器租用价格更新,轻量应用服务器2核2G年付仅38元,2核4G月付9.9元、年付199元,性价比极高,适合个人开发者及小微企业。ECS经济型e实例与通用算力型u1实例分别以99元/年、199元/年提供稳定服务,满足企业级需求。GPU云服务器提供T4、V100等型号折扣,支持AI训练与高性能计算。用户可根据需求、身份及预算,通过活动选购合适服务器,并关注续费价格、购买限制,善用免费试用资源以优化成本。
818 1
|
2月前
|
存储 SQL 数据挖掘
事实表是什么?事实表和维度表有什么区别?
数据仓库中,事实表存储可度量的业务数值(如销售额、订单量),字段少、行数巨多、高频更新;维度表则描述分析上下文(如时间、客户、产品属性),字段多、行数少、相对静态。二者通过主键-外键关联,构成星型模型,支撑多维分析与决策——本质即“度量”与“描述”的协同。
|
存储 监控 安全
电脑格式化了还能恢复数据吗?
在日常使用电脑的过程中,我们可能会因为各种原因需要格式化硬盘。然而,格式化操作会清除硬盘上的所有数据,很多人担心格式化后数据无法找回。本文将详细介绍电脑格式化后的数据恢复方法,帮助大家在不小心格式化硬盘后,仍有机会找回重要文件。
电脑格式化了还能恢复数据吗?
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
1099 2
|
运维 Linux 开发工具
第22篇 如何部署gitLab进行开发版本控制
第22篇 如何部署gitLab进行开发版本控制

热门文章

最新文章