搜索全站
数据库 14 分钟阅读

WordPress 站点临时关闭与下线的正确做法

直接删站或返回 404 会让搜索引擎把收录全删掉。正确的临时关闭应该返回 503 并带 Retry-After。本文给出 Nginx、插件、PHP 三种实现方式,以及永久下线的处理要点。

U
UFO_PF 2026-01-01 · 阅读 14 分钟
Wo 数据库
阅读提示
本文约 5,358 字,预计阅读 14 分钟。文中命令与配置均经过实测,可直接参考执行。

引言:关站也有对错之分

需要临时关闭站点的场景很多:

  • 正在大改版,不想让访客看到半成品;
  • 站点被黑,需要先下线清理;
  • 备案期间必须关站;
  • 服务器迁移过渡期;
  • 业务调整,暂时停止运营。

错误做法:把文件删了,或者返回 404 / 空白页。后果是——搜索引擎几次抓取都是 404,会把页面从索引里删除。等 reopen,收录已经掉光,排名归零,恢复期长达数月。

正确做法:返回 503 Service Unavailable,配合 Retry-After 头,告诉爬虫”我只是暂时不可用,稍后再来”。百度和 Google 都支持这个语义,503 不会导致索引删除。

原理分析:状态码的语义差别

状态码 含义 搜索引擎反应
200 + 维护页 正常 会把维护页当正常内容收录,最糟(原页面被替换成”维护中”)
404 不存在 短期保留,多次后删除索引
410 Gone 永久删除 立即删除索引(永久下线才用)
503 暂时不可用 保留索引,稍后重抓 ✅
302 临时跳转 临时跳转 可能收录为目标页

关键点:绝不能用 200 返回维护页。这是最常见的错误——很多”维护模式插件”默认返回 200,等于告诉搜索引擎”我的网站现在内容就是这样”,几周后所有页面的标题和摘要全变成”网站维护中”。

还必须注意:503 页面对管理员应该放行,否则你自己也进不去后台,无法继续改版工作。

保姆级实操

方案一:Nginx 层(最规范,推荐)

server {
    listen 80;
    server_name mimangfei.com www.mimangfei.com;
    root /var/www/mimangfei;

    # 维护开关:把 1 改成 0 即恢复
    set $maintenance 1;

    # 管理员 IP 放行
    if ($remote_addr = "1.2.3.4") {
        set $maintenance 0;
    }

    # 放行后台路径,方便自己登录操作
    if ($uri ~ ^/(wp-admin|wp-login\.php|wp-cron\.php)) {
        set $maintenance 0;
    }

    if ($maintenance = 1) {
        return 503;
    }

    error_page 503 @maintenance;
    location @maintenance {
        root /var/www/maintenance;
        rewrite ^(.*)$ /503.html break;
        # 关键:告诉爬虫多久后重来(秒)
        add_header Retry-After 86400 always;
        add_header Cache-Control "no-store, must-revalidate" always;
        # 防止 503 页面被收录
        add_header X-Robots-Tag "noindex" always;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }
}

维护页 /var/www/maintenance/503.html:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="robots" content="noindex">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>站点维护中 - mimangfei.com</title>
<style>
  body { font-family: -apple-system, "PingFang SC", "Microsoft YaHei", sans-serif;
         display:flex; align-items:center; justify-content:center;
         min-height:100vh; margin:0; background:#f5f7fa; color:#333; }
  .box { text-align:center; padding:40px; }
  h1 { font-size:24px; margin-bottom:12px; }
  p  { color:#666; line-height:1.8; }
</style>
</head>
<body>
  <div class="box">
    <h1>站点维护中</h1>
    <p>我们正在升级服务器,预计 24 小时后恢复。<br>给您带来不便,敬请谅解。</p>
    <p style="margin-top:20px;font-size:14px;color:#999;">mimangfei.com</p>
  </div>
</body>
</html>
sudo nginx -t && sudo systemctl reload nginx
curl -I https://mimangfei.com/
# HTTP/1.1 503 Service Unavailable
# Retry-After: 86400

要点:error_page 503 @maintenance + return 503 组合能保证状态码确实是 503(而不是 200 + 维护页内容)。

方案二:用插件(最省事,但要验证状态码)

插件 503 支持 说明
WP Maintenance Mode ✅ 可配置 有 “503 Service Unavailable” 选项,务必开启
SeedProd(Coming Soon Page) ✅ 功能全,免费版够用
LightStart ✅ 有 503 选项
Maintenance ✅ 轻量

装完必须验证:

curl -I https://mimangfei.com/ | head -1
# 必须是 HTTP/1.1 503

返回 200 就在插件设置里找 “HTTP 503 Status” / “Response Code” 打开;插件不支持就换一个或改用 Nginx 方案。

另一个要点:多数维护插件对已登录用户放行(后台能看到真实站点),这正好符合需求,确认选项开启。

方案三:PHP 层(无服务器权限)

在主题 functions.php 顶部加:

function mmf_maintenance_mode() {
    // 已登录用户放行
    if ( is_user_logged_in() ) {
        return;
    }
    // 后台和登录页放行
    if ( is_admin() || false !== strpos( $_SERVER['REQUEST_URI'], 'wp-login.php' ) ) {
        return;
    }

    // 关键:必须是 503,不是 200
    status_header( 503 );
    header( 'Retry-After: 86400' );
    header( 'X-Robots-Tag: noindex' );
    nocache_headers();

    echo '<!DOCTYPE html><html lang="zh-CN"><head><meta charset="UTF-8">'
       . '<meta name="viewport" content="width=device-width,initial-scale=1">'
       . '<meta name="robots" content="noindex"><title>维护中</title></head>'
       . '<body style="font-family:sans-serif;display:flex;align-items:center;'
       . 'justify-content:center;min-height:100vh;margin:0;background:#f5f7fa">'
       . '<div style="text-align:center"><h1>站点维护中</h1>'
       . '<p>预计 24 小时后恢复,感谢您的耐心。</p></div></body></html>';
    exit;
}
add_action( 'template_redirect', 'mmf_maintenance_mode', 1 );

注意:主题更新会覆盖这段代码,临时用可以,长期建议插件或服务器层方案。

永久下线的处理

  1. 有新站:整站 301 过去,权重能传递;

nginx
return 301 https://newsite.com$request_uri;

  1. 没有新站:全部返回 410 Gone,让搜索引擎主动删除;

nginx
return 410;

  1. 在百度站长平台提交”死链”、Google Search Console 用”移除网址”;
  2. 保留 DNS 解析至少 3 个月,让爬虫有机会抓到 410;
  3. 取消 sitemap 提交。

恢复上线

  1. $maintenance 改回 0(或禁用插件);
  2. curl -I 确认返回 200;
  3. 到百度站长平台 / Google Search Console 主动推送、请求重新抓取;
  4. 检查 robots.txt 没有误封;
  5. 观察 3–7 天收录恢复情况。

常见踩坑

  1. 维护页返回 200:最致命的错误,会导致全站被收录成”维护中”。必须验证状态码。
  2. 把自己也关在外面:忘了放行 wp-admin 和自己的 IP。改完不要关当前标签页,用无痕窗口测试。
  3. CDN 缓存了 503:恢复后访客还看到维护页。恢复后必须刷新 CDN,或维护期间在 CDN 控制台设置 / 不缓存。
  4. 案例:某站备案期间关站三个月,站长直接把解析停了(DNS 失效)。恢复后百度收录从 3000 掉到 200。正确做法是保持解析 + 返回 503,收录基本无损。
  5. Retry-After 设太长:爬虫会真等那么久。短期维护设 3600,长期设 86400。
  6. 维护页没加 noindex:即使 503,也建议加 X-Robots-Tag: noindex 双保险。
  7. wp-cron 停止运行:关站期间无人访问,定时任务不执行。恢复后检查 wp cron event list 有无堆积。

总结

临时关站的黄金法则:返回 503 + Retry-After + 放行管理员。Nginx 方案最规范可控,插件方案最省事但必须验证状态码是 503 而非 200(这是绝大多数人的坑)。永久下线则用 301 到新站或返回 410,并在站长平台主动提交死链。恢复上线后记得刷新 CDN、主动推送、观察收录。想了解站点健康度的长期监控可参考WordPress 运维监控搭建,日常巡检见WordPress 月度安全巡检清单。

U
UFO_PF作者

专注 WordPress 生态的实战作者,内容以「可复制、可验证」为第一原则。

留下你的想法

邮箱地址不会被公开。带 * 的为必填项。