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
93 lines
4.6 KiB
Bash
Executable File
93 lines
4.6 KiB
Bash
Executable File
#!/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
|