必须用301永久重定向,禁用302和rewrite混用;return 301 https://$host$request_uri精准跳转,配合map白名单防Host劫持,并启用HSTS与canonical标签双重加固。

要避免 HTTPS 迁移过程中 SEO 权重受损,Nginx 必须用301 永久重定向,且确保跳转行为精准、可信、无歧义。临时跳转(302)、路径丢失、Host 头劫持、多入口并存等问题,都会中断权重传递链。
只用 301,禁用 302 和 rewrite permanent 混用
301 是搜索引擎识别“永久迁移”的唯一可靠信号;302 被视为临时动作,不传递链接权重,旧 URL 仍会被索引。
- HTTP → HTTPS 跳转必须统一使用
return 301,不是rewrite ... permanent—— 前者直接响应、无隐式重匹配风险,后者可能触发 location 重复判断或循环 - 禁止在任何场景下对主流量返回 302,包括登录跳转、参数清理等——除非明确用于 A/B 测试或短时维护
- 检查日志中是否出现大量 302 响应:若有,说明某处配置误用了
rewrite或遗漏了permanent
全量覆盖 + 完整保留路径与参数
所有 HTTP 请求都必须被拦截并跳转,且目标 URL 必须包含原始路径和查询参数,否则将导致大量 404 和爬虫弃权。
- 监听 80 端口的 server 块中,
server_name需列出全部生效域名(如example.com www.example.com),或用通配符兜底 - 跳转语句写为:
return 301 https://$host$request_uri;——$request_uri包含完整路径+查询串,$host自动适配请求头中的 Host(但需配合 Host 白名单校验,见下文) - 切勿写成
return 301 https://example.com;或return 301 https://$host/;,这会强制跳首页,丢弃全部参数和路径
规范主域名入口,消除 www / 非 www 分裂
HTTPS 下若同时可访问 https://example.com 和 https://www.example.com,搜索引擎会当作两个独立站点,造成权重稀释。
- 选定一个 canonical 主域(裸域或 www),并在 443 端口的 server 块中做二次 301 规范化
- 例如主域为裸域,则为 www 的 HTTPS 请求单独配一个 server 块:
server { listen 443 ssl; server_name www.example.com; ssl_certificate ...; return 301 https://example.com$request_uri; } - 该跳转必须发生在 HTTPS server 内,不能仅靠 80 端口跳转解决——因为用户可能直接输入 https://www.example.com
防御 Host 头劫持,防止重定向被滥用
直接使用 $host 构造跳转地址存在安全风险:攻击者可伪造 Host 头(如 Host: evil.com),让 Nginx 返回 Location: https://evil.com/xxx,形成开放重定向漏洞。
- 用
map指令白名单校验 Host:map $http_host $valid_host { default ""; example.com "example.com"; www.example.com "example.com"; }
后续用$valid_host替代$host,不匹配则return 444(立即断连) - 更稳妥做法是硬编码主域名:
return 301 https://example.com$request_uri;,彻底规避 Host 变量污染 - HTTP server 块中禁用
proxy_set_header Host $host,避免透传不可信 Host 给后端
补充加固:HSTS + canonical 标签双保险
技术配置之外,还需配合协议级与页面级信号,增强搜索引擎对规范地址的信任。
- 在 HTTPS server 块中启用 HSTS:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
确保该头只通过 HTTPS 发送,且always参数让它在 301 响应中也生效 - 所有页面 HTML 的
<head>中添加 canonical 标签:<link rel="canonical" href="https://example.com/current-path">
即使某次请求漏过 Nginx 跳转,也能兜底告知搜索引擎“这是唯一权威地址” - 上线后用
curl -I http://example.com/some-page?page=1验证返回是否为 301 + 正确 Location,再用 Google Search Console 的「URL 检查」工具确认重定向链被正确识别


















