Nginx的301重定向无法直接返回HTML内容,需先301跳转至本地静态退休页(如/system-retired.html),该页含迁移说明、新地址链接及meta refresh自动跳转,并通过canonical标签和Link头强化SEO语义。

当老旧系统彻底下线时,Nginx 的 301 重定向本身不支持直接返回带 HTML 内容的响应体(它默认只发状态码和 Location 头),所以“友好提示”不能靠纯 301 实现。但你可以用一个轻量、可靠且对 SEO 友好的组合方案:用 301 跳转到一个专门的过渡页,该页面由 Nginx 自己托管,包含清晰说明、新地址入口和自动跳转逻辑。
用 Nginx 托管一个静态友好跳转页
在 Nginx 配置中,不直接 return 301 到新域名,而是 return 301 到一个本地路径(比如 /system-retired.html),这个 HTML 文件放在 Nginx 的 root 目录下,内容可自定义:
- 说明“原服务已永久迁移至 XXX”
- 给出新系统的链接(带 target="_blank" 或醒目标识)
- 加入 3 秒后自动跳转到新地址的 meta refresh(作为辅助,不影响 301 的 SEO 语义)
- 保持简洁、无 JS 依赖,确保所有用户(含爬虫和旧浏览器)都能看到核心信息
配置示例(server 块内)
假设老系统域名为 old.example.com,新系统为 new.example.com:
server {
listen 80;
server_name old.example.com;
<pre class="brush:php;toolbar:false;"># 所有请求都跳转到本地退休页(返回 301,不是内部重写)
location / {
return 301 https://old.example.com/system-retired.html;
}
# 静态退休页单独处理,允许直接访问并返回 HTML
location = /system-retired.html {
root /usr/share/nginx/html; # 确保该路径下存在 system-retired.html
add_header Content-Type "text/html; charset=utf-8";
}}
注意:return 301 后的 URL 必须是完整 URL(含协议和域名),否则 Nginx 会当成相对重定向出错;这里故意指向自己域名下的路径,是为了可控交付 HTML。
补充:让爬虫和用户都明确感知“永久迁移”
仅靠跳转页还不够,需强化语义:
- 在 system-retired.html 的 中添加
<link rel="canonical" href="https://new.example.com/">,帮助搜索引擎理解权威目标 - 响应头中显式设置
Link: <https:></https:>; rel="alternate"; hreflang="x-default"(可选,增强语义) - 如果旧系统还残留部分 API 路径,可用 location 匹配 + return 301 到对应新接口地址,避免 404
为什么不直接 return 301 到新域名并附带 HTML?
HTTP 协议规定,301 响应体通常被客户端忽略(浏览器只看 Location 头跳转)。即使你强行在 return 后加 body,Nginx 也不会发送——return 指令不支持自定义响应体。想发 HTML 只能走 content-type 为 text/html 的 200 响应,或用 error_page + named location 组合模拟,但那样就不是标准 301,会丢失 SEO 权重传递效果。因此,分两步(301 → 静态页)是最稳妥的平衡方案。


















