在 Nginx 反向代理场景中启用 HTTPS 强制跳转,核心是在监听 80 端口的 server 块中使用 return 301 指令,将请求永久重定向到 HTTPS 地址,同时确保 443 端口配置了正确的 ssl 证书及 proxy_pass 反向代理规则。
先说结论:配置 80 端口监听并返回 301 状态码是行业标准做法,既不影响搜索引擎收录,也能确保用户连接加密。在反向代理架构下,需同时保证 443 端口能正确转发流量到后端服务。
- 先判断:确认 443 端口 HTTPS 服务已正常运作且证书有效,后端服务可达
- 优先做:在 80 端口 server 块配置 return 301 跳转规则,443 块配置 proxy_pass
- 再验证:使用 curl 检查 HTTP 请求是否自动变为 HTTPS 且后端内容正常返回
完整配置示例(80 跳转 +443 代理)
以下是一个典型的反向代理配置结构,包含 HTTP 强制跳转和 HTTPS 代理转发。请根据实际域名和后端地址修改。
server {
listen 80;
server_name example.com;
# 使用 $server_name 避免非标准端口请求导致跳转后携带端口号
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
# 反向代理核心配置
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}注意:将上述配置放入 Nginx 配置文件(如 /etc/nginx/conf.d/default.conf 或 sites-enabled 目录下),确保 server_name 与实际域名一致,ssl 证书路径正确。
分步处理
1. 备份配置文件。修改前执行 cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak 或备份当前 site 配置。
2. 确认 443 配置。检查监听 443 端口的 server 块已正确配置 ssl_certificate 和 ssl_certificate_key,且 proxy_pass 指向的后端服务端口可达。
3. 添加 80 端口配置。如果不存在监听 80 的 server 块,新建一个;如果存在,修改其内容为重定向逻辑,确保不再处理业务逻辑。
4. 检查语法。执行 nginx -t 确认配置无误,关注是否有 ssl 路径错误或语法冲突。
5. 重载服务。执行 nginx -s reload 或 systemctl reload nginx。
怎么验证是否生效
1. 检查跳转:在终端执行 curl -I http://example.com,观察返回头中的 Location 字段是否以 https:// 开头,且状态码为 301。
2. 检查代理:执行 curl -k https://example.com,确认能获取到后端服务的实际响应内容,而非 Nginx 默认欢迎页。
3. 浏览器验证:在浏览器地址栏手动输入 http:// 开头地址,确认地址栏自动变为 https:// 且锁形图标显示正常,页面内容加载无误。
常见坑
1. 跳转循环。如果 443 端口配置错误也跳回 80,会导致浏览器报错“重定向次数过多”。务必确保 443 块中没有 return 301 http:// 的逻辑。
2. 混合内容。页面跳转后,如果内部资源(图片、JS、CSS)仍引用 http:// 链接,浏览器会报不安全警告。建议后端返回的 HTML 中资源链接也使用相对路径或 https://。
3. HSTS 配合。若启用 HSTS,需确保证书有效后再开启,否则用户一旦记录策略,证书过期时将无法访问。
4. 端口携带问题。使用 $host 变量在跳转时,如果用户请求携带了非标准端口(如 :8080),跳转后的 HTTPS 地址也会携带该端口。建议跳转目标使用 $server_name 确保域名纯净。
参考来源
- Nginx 官方文档 - ngx_http_rewrite_module: https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return
- Nginx 官方文档 - HTTPS 配置示例:https://nginx.org/en/docs/http/configuring_https_servers.html
- Nginx 官方文档 - ngx_http_proxy_module: https://nginx.org/en/docs/http/ngx_http_proxy_module.html