全站启用https后,nginx反向代理重定向正常的关键是:一级入口用return 301 https://$host$request_uri强制跳转;后端通过x-forwarded-proto识别协议并生成https跳转地址;前端避免混合内容,配置hsts与csp。

全站启用 HTTPS 后,Nginx 反向代理的重定向要正常,关键不是“让 Nginx 自己跳转”,而是确保整个链路中协议标识准确传递、后端生成的跳转地址本身是 HTTPS,并且浏览器不因混合内容而阻断或降级行为。
一级入口:HTTP 请求必须 301 跳转到 HTTPS
这是用户首次访问时的强制拦截点,必须独立监听 80 端口,不走任何 proxy_pass:
- 配置在单独的
server { listen 80; ... }块里,用return 301 https://$host$request_uri; - 避免使用
rewrite,它有正则开销且易出循环;也别把这条写在 443 的 server 块里,否则会死循环 - 域名和路径参数必须原样保留,
$request_uri已自动包含 query string 和路径
末端代理:后端必须知道客户端用了 HTTPS
如果后端服务(如 Node.js、Spring Boot、Django)生成跳转响应(例如登录后 302 到 /dashboard),它得输出 https:// 开头的 Location 地址,否则浏览器会发起不安全的 HTTP 请求。
- 在最终连接后端的那台 Nginx 上,务必设置:
proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto; - 前提是上游已正确透传该头(一级代理应设
proxy_set_header X-Forwarded-Proto https;,中间层不做覆盖) - 后端代码需读取
X-Forwarded-Proto判断协议,而不是硬编码或依赖本机$scheme
防止混合内容与浏览器降级
即使 Nginx 配置无误,前端页面里写的 http:// 资源链接(CSS/JS/图片/AJAX)仍会被现代浏览器拦截,导致页面白屏或功能异常。
- 在 443 的 server 块中添加 HSTS 头:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - 前端 HTML 中加入 CSP 指令:
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> - 检查后端模板或构建工具(如 Vue CLI、Webpack)是否生成了绝对 HTTP 链接,应统一用相对路径或协议无关写法(
//example.com/api)
验证要点:三处 Location 必须全是 HTTPS
一次典型重定向流程中,有三个关键 Location 值需要检查:
- 用户访问
http://example.com→ Nginx 返回 301,Location 是https://example.com/ - 后端返回 302(如登录跳转)→ 响应头 Location 应为
https://example.com/dashboard(非 http) - 浏览器加载页面后,控制台 Network 标签中所有资源请求协议都应显示为
https,无 mixed-content 报错











