必须用 return 301 在独立的 listen 80 server 块中实现跳转,禁用 rewrite 和 $host,避免循环重定向、开放重定向及配置失效。

直接用 return 301,别碰 rewrite —— 这是唯一靠谱的起点。 大多数人卡在跳转不生效、循环重定向、或搜索引擎不收录新域名,问题八成出在用了 rewrite 却没加 permanent,或者把重定向塞进 location 块却忘了 = 精确匹配。
用 return 301 实现旧域名 → 新域名跳转
必须单独起一个 server 块,监听 80 端口,只负责跳转:
server {
listen 80;
server_name old.example.com;
return 301 https://new.example.com$request_uri;
}
-
server_name必须精确写死旧域名,不能带通配符或正则(否则可能匹配到不该跳的请求) - 目标 URL 里不要用
$host—— 它可能为空或被恶意篡改,导致跳到https:///xxx这种非法地址 - HTTPS 跳转必须显式写
https://,不能只写$scheme://,因为 HTTP 请求的$scheme是http,会跳回 HTTP - 改完必须执行
nginx -t && nginx -s reload,只reload不校验配置容易静默失败
HTTP → HTTPS 全站跳转必须独立监听 80 端口
很多人试图在 HTTPS 的 server 块里加 listen 80;,Nginx 会拒绝加载配置,报错 address already in use 或直接忽略。
- 正确做法:另起一个纯 HTTP 的
server块,只做跳转,例如: server { listen 80; server_name example.com www.example.com; return 301 https://www.example.com$request_uri; }- 不要在同一个
server块里既listen 443 ssl又listen 80—— Nginx 不允许混用 - 如果服务器只跑这一个站,建议把默认
server块也设为跳转,防 IP 直连暴露后端路径
error_page 404 跳转必须走命名 location
想让 404 自动 301 跳首页?不能这么写:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
error_page 404 https://example.com/;
Nginx 会直接返回 404 页面,不是跳转。也不能这么写:
error_page 404 =301 https://example.com/;
语法错误,error_page 不支持直接返回状态码+URL。
- 必须用命名
location中转: error_page 404 = @notfound; location @notfound { return 301 https://example.com$request_uri; }- 注意
error_page 404 = @notfound中的=不能少,漏了就变成内部重定向到@notfound再返回 200,不是 301 - 命名
location里禁用rewrite,否则容易触发rewrite or internal redirection cycle错误
多个域名共用配置时,$host 是危险变量
当 server_name a.com b.com;,再写 return 301 https://$host$request_uri;,看似简洁,实则埋雷:
- 用户用 IP 访问时,
$host为空,跳转地址变成https:///xxx,浏览器报错 - 攻击者伪造
Host: evil.com头,就能把你的用户劫持到任意域名(开放重定向漏洞) - 更安全的做法是显式判断或硬编码目标域名:
if ($host = "a.com") { return 301 https://www.a.com$request_uri; } if ($host = "b.com") { return 301 https://www.b.com$request_uri; }- 或者干脆不依赖
$host,每个域名独立server块,配置清晰且无风险
最常被忽略的一点:所有跳转都必须在监听 80 的 server 块中完成;HTTPS 的 server 块只处理加密流量,它不接收原始 HTTP 请求 —— 这个边界一旦混淆,整个跳转逻辑就失效了。

















