diff --git a/scripts/ops/seo-unblock.sh b/scripts/ops/seo-unblock.sh new file mode 100755 index 0000000..4b7094f --- /dev/null +++ b/scripts/ops/seo-unblock.sh @@ -0,0 +1,88 @@ +#!/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