From 50c75958386ad1b109678d817c0a2b9acffe696b Mon Sep 17 00:00:00 2001 From: wait4xx Date: Sun, 1 Nov 2026 11:06:58 +0800 Subject: [PATCH] =?UTF-8?q?feat(ops):=20SEO=20=E8=A7=A3=E5=B0=81=E4=B8=80?= =?UTF-8?q?=E9=94=AE=E8=84=9A=E6=9C=AC=E2=80=94=E2=80=94=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E7=A1=AE=E8=AE=A4=E6=89=A7=E8=A1=8C=E8=87=AA=E6=A3=80=E5=9B=9E?= =?UTF-8?q?=E6=BB=9A=E4=BA=94=E6=AE=B5=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit nginx 侧全自动(snippet 剥离/内部 vhost 补回/admin 局部/失败回 滚/源站终验),ESA 三动作打印手动步骤;dry-run 先行+确认门。 验证: bash -n 语法过;dry-run 输出与 Phase 5f T1 操作单变更计划一致 Spec: none (用户操作单自动化,Phase 5f T1 收尾件) Co-authored-by: GLM-5.3 --- scripts/ops/seo-unblock.sh | 88 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 scripts/ops/seo-unblock.sh 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