Cloudflare边缘证书方案下Nginx无需证书,仅监听80端口处理HTTP请求;必须开启DNS代理(橙色云朵),加密模式设为“完全(严格)”,并通过X-Forwarded-Proto头识别原始HTTPS协议以确保链接安全。

直接用 Cloudflare 的边缘证书,Nginx 本身不需要证书文件——因为 HTTPS 终止在 Cloudflare,到 Nginx 这一跳走的是普通 HTTP。这种方式最轻量、免维护,适合绝大多数个人站和中小项目。
Cloudflare 端必须开启代理(小云朵为橙色)
这是前提。只有开启代理,流量才经过 Cloudflare,它才能提供 HTTPS 加密给访客,并把解密后的请求以 HTTP 方式转发到你的 Nginx。
- DNS 记录中,A 或 CNAME 条目的“代理状态”必须是 Proxied(橙色云朵),不能是 DNS only(灰色)
- 确保域名已成功接入 Cloudflare(NS 已切换),且 DNS 解析生效
- 在 SSL/TLS → 概述 中,加密模式建议设为 完全(严格),避免混合内容或中间人风险
Nginx 只监听 80 端口,不配 SSL 模块也行
既然 HTTPS 在 Cloudflare 终止,Nginx 只需处理来自 Cloudflare 的明文 HTTP 请求,所以配置极简:
- server 块里 不需要 ssl_certificate / ssl_certificate_key
- listen 只写 listen 80;(或 listen 8000; 如果你用非标端口)
- 务必校验请求头中的
X-Forwarded-Proto: https,用于识别原始协议(后续跳转或生成链接时需要)
示例配置片段:
listen 80;
server_name example.com www.example.com;
root /var/www/html;
index index.html;
# 强制后端感知 HTTPS(关键)
set $scheme_https "https";
if ($http_x_forwarded_proto = "https") {
return 301 $scheme_https://$host$request_uri;
}
}
让网站正确显示 HTTPS 链接和安全锁
即使用户用 https:// 访问,Nginx 收到的仍是 http 请求,如果不处理,页面内链接、重定向、API 地址可能变成 http,导致“不安全内容”警告或跳转失败。
- 在 Nginx 配置中添加:proxy_set_header X-Forwarded-Proto $scheme;(如果你用反向代理)
- 应用层(如 PHP、Node.js)应读取
X-Forwarded-Proto头来判断是否 HTTPS,而不是只看$_SERVER['HTTPS']或req.protocol - 静态资源 URL、表单 action、重定向 Location,都应基于该头动态生成协议
可选:加一层 HSTS(谨慎启用)
如果确认长期使用 Cloudflare + HTTPS,可在 Nginx 返回头中加入 HSTS,告诉浏览器“以后只许用 HTTPS 访问”:
- 添加响应头:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
- 注意:不要勾选 Cloudflare 控制台里的 “HSTS Preload”,除非你已满足 preload 列表全部要求(如主域+www 必须同时支持 HTTPS、有有效证书、max-age ≥ 31536000 等)
- 首次启用建议先用较短 max-age(如 300)测试,确认无误再延长











