Files
blog/scripts/ops/seo-unblock.sh
T
wait4xandGLM-5.3 d41fcc058c fix(ops): seo-unblock v2——备份出加载路径+主机判定精确 token
v1 实弹暴露两缺陷:①.bak-seo 备份留在 sites-enabled/ 内被 nginx
glob 加载→duplicate default server 全链崩;②grep -w 词边界点号
之误,git.wait4x.online 也被当博客主站注入 admin location。
v2:备份入 /tmp 专属目录+回滚后清理(含 v1 遗留)+server_name
精确 token 判定。

验证: bash -n 语法过;dry-run 计划段与判定正则复核

Spec: none (脚本热修:v1 事故根因双修)

Co-authored-by: GLM-5.3
2026-11-01 11:11:27 +08:00

93 lines
4.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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)"
BAKDIR=/tmp/seo-unblock-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 -qE "server_name[^;]*(^|[[:space:]])(www\.)?wait4x\.online([[:space:]];|$)" || echo "$names" | grep -qx "server_name 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 -qE "server_name[^;]*(^|[[:space:]])(www\.)?wait4x\.online([[:space:]];|$)" || echo "$names" | grep -qx "server_name 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 mkdir -p "$BAKDIR"
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 -qE "server_name[^;]*(^|[[:space:]])(www\.)?wait4x\.online([[:space:]];|$)" || echo "$names" | grep -qx "server_name wait4x.online;"; then
if ! sudo grep -q "X-Robots-Tag" "$f"; then
sudo cp "$f" "$BAKDIR/$(basename "$f")"
# 在首个 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 -qE "server_name[^;]*(^|[[:space:]])(www\.)?wait4x\.online([[:space:]];|$)" || echo "$names" | grep -qx "server_name wait4x.online;"; then
if ! sudo grep -q "location /admin/" "$f"; then
sudo cp "$f" "$BAKDIR/$(basename "$f")"
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 "$BAKDIR"/*; do
[ -f "$f" ] && sudo cp "$f" "$SITES/$(basename "$f")"
done
sudo rm -rf "$BAKDIR"
sudo rm -f "$SITES"/*.bak-seo # v1 遗留备份也在加载路径上,一并清掉
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