Files
blog/scripts/ops/seo-unblock.sh
T
wait4xandGLM-5.3 3b65cc47ec fix(ops): seo-unblock v3 补——博客主站判定字符类修正
v2 残留:([[:space:]];|$) 被解析为空格+分号序列而非字符类,-x 兜底
吃行首缩进——admin location 两轮未落。统一 (^|[[:space:];]) 词边界
并显式排除 git 子域。

验证: bash -n 过;判定正则对 /etc/nginx/sites-enabled/default 实文件
干跑(博客行命中/git 行排除双验)

Spec: none (脚本热修 v3 补)

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

93 lines
4.5 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 sudo grep -q "include snippets/esa-origin-ssl" "$f" && ! echo "$names" | grep -qE "(^|[[:space:];])(www\.)?wait4x\.online([[:space:];]|$)" && ! echo "$names" | grep -qE "(^|[[:space:]])git\.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 "(^|[[:space:];])(www\.)?wait4x\.online([[:space:];]|$)" && ! echo "$names" | grep -qE "(^|[[:space:]])git\.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 sudo grep -q "include snippets/esa-origin-ssl" "$f" && ! echo "$names" | grep -qE "(^|[[:space:];])(www\.)?wait4x\.online([[:space:];]|$)" && ! echo "$names" | grep -qE "(^|[[:space:]])git\.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 "(^|[[:space:];])(www\.)?wait4x\.online([[:space:];]|$)" && ! echo "$names" | grep -qE "(^|[[:space:]])git\.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