#!/usr/bin/env bash # SEO 解封脚本(Phase 5f T1 操作单自动化) # 作用:①剥共享 snippet 的全站 noindex ②内部服务 vhost 补回 ③博客 vhost /admin 局部 noindex # ④nginx -t 后重载,失败自动回滚 ⑤终验三条 curl # ESA 控制台三动作(purge/TTL/绕缓存)无法脚本化,结尾打印手动步骤。 # 用法:bash scripts/ops/seo-unblock.sh (需要 sudo,全程有预览和确认) set -euo pipefail SNIPPET=/etc/nginx/snippets/esa-origin-ssl.conf BAK="${SNIPPET}.bak-$(date +%s)" SITES=/etc/nginx/sites-enabled echo "==== ① 现状 ====" sudo grep -n "X-Robots-Tag" "$SNIPPET" || echo "(snippet 已无 noindex——可能已执行过)" echo echo "==== ② 变更计划(DRY-RUN)====" echo " [snippet] ${SNIPPET}:删除 X-Robots-Tag noindex 行" for f in "$SITES"/*; do names=$(sudo grep -h "server_name" "$f" 2>/dev/null || true) [ -z "$names" ] && continue # 内部服务判定:server_name 含内部子域且不含主站裸域 if echo "$names" | grep -qE "(git|api|oj|token|fc|latex|cpa)\.wait4x\.online" && ! echo "$names" | grep -qw "wait4x.online"; then sudo grep -q "X-Robots-Tag" "$f" || echo " [补回] $f:server 块加 add_header X-Robots-Tag noindex always;" fi # 博客主站判定:server_name 恰含裸域 if echo "$names" | grep -qw "wait4x.online"; then sudo grep -q "location /admin/" "$f" || echo " [新增] $f:location /admin/ { noindex }" fi done echo read -rp ">> 按计划执行?(y/N) " ok; [ "$ok" = "y" ] || { echo "已取消(未做任何修改)"; exit 0; } echo echo "==== ③ 执行 ====" sudo cp "$SNIPPET" "$BAK" && echo " 备份:$BAK" sudo sed -i '/X-Robots-Tag noindex/d' "$SNIPPET" && echo " snippet 已剥 noindex" for f in "$SITES"/*; do names=$(sudo grep -h "server_name" "$f" 2>/dev/null || true) [ -z "$names" ] && continue if echo "$names" | grep -qE "(git|api|oj|token|fc|latex|cpa)\.wait4x\.online" && ! echo "$names" | grep -qw "wait4x.online"; then if ! sudo grep -q "X-Robots-Tag" "$f"; then sudo cp "$f" "$f.bak-seo" # 在首个 server_name 行后插入(server 块内、顶层指令位置合法) sudo sed -i "0,/server_name/s/\(server_name.*\)/\1\n add_header X-Robots-Tag noindex always;/" "$f" echo " 补回:$f" fi fi if echo "$names" | grep -qw "wait4x.online"; then if ! sudo grep -q "location /admin/" "$f"; then sudo cp "$f" "$f.bak-seo" 2>/dev/null || sudo cp "$f" "$f.bak-seo" sudo sed -i "0,/server_name/s/\(server_name.*\)/\1\n location \/admin\/ { add_header X-Robots-Tag noindex always; }/" "$f" echo " admin 局部:$f" fi fi done echo echo "==== ④ 语法检查+重载(失败自动回滚)====" if ! sudo nginx -t; then echo "!! nginx -t 失败,回滚全部改动" sudo cp "$BAK" "$SNIPPET" for f in "$SITES"/*.bak-seo; do [ -f "$f" ] && sudo cp "$f" "${f%.bak-seo}" done sudo nginx -t && sudo systemctl reload nginx echo "已回滚,请把以上报错发给 research 人工处理"; exit 1 fi sudo systemctl reload nginx && echo " nginx 已重载" echo echo "==== ⑤ 终验(对源站直测)====" H=$(curl -sI --noproxy '*' -m 10 https://wait4x.online/ | grep -ci x-robots-tag || true) A=$(curl -sI --noproxy '*' -m 10 https://wait4x.online/admin/ | grep -ci noindex || true) echo " 主站 noindex 头:$H(期望 0) /admin/ noindex:$A(期望 1)" if [ "$H" = "0" ] && [ "$A" = "1" ]; then echo " ✅ 源站解封成功"; else echo " ⚠️ 不符预期——把上面两行发给 research"; fi cat <<'EOF' ==== ⑥ 剩余手动步骤:ESA 控制台(无法脚本化)==== 1. 全站 purge:wait4x.online(不做的话 noindex 头在边缘再活 30 天) 2. HTML 边缘缓存 TTL 调 ≤1 小时(当前 30 天) 3. 加规则:/artalk/api/* 路径绕过缓存(pv 数字不再冻结) 4. 顺带查 git.wait4x.online 为何 522(源站健康/回源配置) 完成后告诉 research:将跑生产 Lighthouse 入档(预期 SEO 60→95+)。 EOF