HTTPS配置需确保证书域名匹配、强制跳转、SPA路由回退及代理头透传四环节完整:证书须覆盖所有域名(含www),HTTP需301跳转至HTTPS,SPA需try_files $uri $uri/ /index.html,反向代理须设X-Forwarded-Proto $scheme。

证书没匹配域名,HTTPS会直接报“不安全”
浏览器显示红色警告、地址栏没有锁图标,八成是证书和你访问的域名对不上。比如证书是 example.com,但用户输的是 www.example.com,而证书里没包含这个子域名,Nginx 就会把未匹配的请求当成“非法”,直接拒绝加密握手。
- 申请证书时,务必勾选所有要支持的域名(含
www前缀);用 Let’s Encrypt 的话,在宝塔「SSL」页勾选多个子域名再申请 - 阿里云/腾讯云下载的证书包里,
.crt和.key文件必须一一对应——cloud.tencent.com_bundle.crt配cloud.tencent.com.key,混用会导致 Nginx 启动失败 - 如果用了泛域名证书(如
*.example.com),它不自动覆盖根域名example.com,得额外加一条,否则访问根域名仍会告警
配置完 HTTPS,HTTP 还能访问?那是没设 301 跳转
很多站长以为点了「强制 HTTPS」就万事大吉,结果搜索引擎还在抓取 HTTP 页面,用户手动输 http:// 也能打开——这等于把流量和权重一分为二,SEO 直接掉一半。
- 宝塔站点设置里「SSL」页勾选「强制 HTTPS」,本质是在 Nginx 配置中加了一段
return 301 https://$host$request_uri;,但前提是 80 端口监听正常且没被其他服务占用 - 如果服务器开了 CDN,CDN 层也得单独开启 HTTPS 并配置回源协议(建议设为「HTTP 回源」,避免套娃加密引发超时)
- 检查是否生效:终端执行
curl -I http://your-domain.com,返回状态码要是301 Moved Permanently,且Location头指向https://地址
Vue/React 前端刷新 404?不是 HTTPS 的锅,是 Nginx 没配 history fallback
HTTPS 配好了,首页能打开,但点路由链接再刷新页面就 404——这不是证书问题,是单页应用(SPA)的路由模式和 Nginx 默认静态服务逻辑冲突了。
- 进入宝塔站点「配置文件」,在
server块里找到location /区域,把默认的index index.html改成:try_files $uri $uri/ /index.html; - 别漏掉末尾的分号,也别写成
$uri//index.html(多一个斜杠会导致路径错误) - 如果后端接口走反向代理(比如
/api转发到 Node.js),这段try_files规则不能放在location /api里,否则会干扰代理逻辑
HTTPS 能用但接口跨域?多半是 Nginx 代理头没透传
前端跑在 https://a.com,调 https://a.com/api 却提示跨域,说明你虽然用了 HTTPS,但后端服务实际监听的是内网端口(如 127.0.0.1:3000),Nginx 代理时没带关键请求头,后端框架(如 Express、Koa)误判了来源协议。
- 在 Nginx 的
location /api块里,必须加上:proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header X-Real-IP $remote_addr; - Node.js 后端要用
app.set('trust proxy', true)(Express)或等效配置,否则req.protocol仍是http,导致生成的重定向 URL 或 CORS header 出错 - 别在前端硬写
http://localhost:3000,开发环境用代理,生产环境全走同域/api,这是最省事的解法
HTTPS 不是点一下「开启」就完事的事——证书匹配、跳转逻辑、前端路由、代理头透传,四个环节只要一个断掉,用户看到的就是锁图标消失、白屏、404 或跨域报错。最容易被忽略的是 X-Forwarded-Proto 这个头,它不显眼,但缺了就会让整个 HTTPS 流程在后端那里「失真」。










