From c4bdf466144b53d2f90b3b474207d05967628330 Mon Sep 17 00:00:00 2001 From: wait4xx Date: Mon, 2 Nov 2026 16:03:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(ops):=20.mjs=20MIME=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E2=80=94=E2=80=94pdf.js=20worker=20=E7=BA=BF?= =?UTF-8?q?=E4=B8=8A=E5=8A=A0=E8=BD=BD=E5=A4=B1=E8=B4=A5=E6=A0=B9=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 线上 /_astro/pdf.worker.min.*.mjs 被 nginx 以 application/octet-stream 返回(mime.types 无 mjs 映射),浏览器拒绝以 module worker 加载 → /papers/ 页 pdf.js 静默回落兜底卡;本地 python 测试床能猜对 MIME 故未 暴露。脚本幂等追加 mjs 到既有 javascript 映射行,-t 门禁+回滚+线上终验。 验证: bash -n 过;线上 worker 头实测 application/octet-stream(病根实证) Spec: none (运维修复脚本) Co-authored-by: GLM-5.3 --- scripts/ops/fix-mjs-mime.sh | 43 +++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100755 scripts/ops/fix-mjs-mime.sh diff --git a/scripts/ops/fix-mjs-mime.sh b/scripts/ops/fix-mjs-mime.sh new file mode 100755 index 0000000..b08e729 --- /dev/null +++ b/scripts/ops/fix-mjs-mime.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash +# 修复 .mjs MIME:nginx 未映射 mjs → 以 application/octet-stream 返回, +# 浏览器拒绝以 module worker 加载(pdf.js 在 /papers/ 页失败回落的根因) +# 用法:sudo bash scripts/ops/fix-mjs-mime.sh (幂等 + -t 门禁 + 回滚) +set -euo pipefail +MIME=/etc/nginx/mime.types +BAK=/tmp/mime.types.bak-$(date +%s) + +echo "==== ① 现状 ====" +grep -nE "\bmjs\b" "$MIME" || echo "(mime.types 里没有 mjs 映射 ← 这就是病根)" +echo -n "线上实测 worker Content-Type: " +curl -sI --noproxy '*' -m 10 "https://wait4x.online/_astro/$(ls /home/wait4x/Code/Github/my-blog/dist/_astro/ | grep -E 'pdf\.worker.*\.mjs' | head -1)" | grep -i "^content-type" | tr -d '\r' + +echo +echo "==== ② 计划 ====" +echo " 在 $MIME 的 types 块内插入:application/javascript mjs;" + +echo +read -rp ">> 执行?(y/N) " ok; [ "$ok" = "y" ] || { echo "已取消"; exit 0; } + +cp "$MIME" "$BAK" +if ! grep -qE "^\s*application/javascript\s+.*\bmjs\b" "$MIME"; then + # 插到 text/javascript 行尾(同块),保持 types{} 内语法 + if grep -qE "^\s*(application|text)/javascript\s+[^;]*js;" "$MIME"; then + # 追加到既有 javascript 映射行(nginx mime.types 标准形态:application/javascript js;) + sed -i -E '0,/^\s*(application|text)\/javascript\s+([^;]*);/s//\1\/javascript \2 mjs;/' "$MIME" + echo " 已在 javascript 映射行追加 mjs" + else + sed -i '0,/types {/s//types {\n application\/javascript mjs;/' "$MIME" + echo " 已在 types 块首插入 mjs" + fi +fi + +echo +echo "==== ③ 门禁 ====" +if ! nginx -t; then echo "!! 语法失败,回滚"; cp "$BAK" "$MIME"; nginx -t && systemctl reload nginx; exit 1; fi +systemctl reload nginx && echo " nginx 已重载" +echo +echo "==== ④ 终验 ====" +W=$(ls /home/wait4x/Code/Github/my-blog/dist/_astro/ | grep -E 'pdf\.worker.*\.mjs' | head -1) +CT=$(curl -sI --noproxy '*' -m 10 "https://wait4x.online/_astro/$W" | grep -i "^content-type" | tr -d '\r') +echo " worker $W → $CT(期望含 javascript)" +case "$CT" in *javascript*) echo " ✅ MIME 已修,刷新 https://wait4x.online/papers/agensh/ 应见 PDF";; *) echo " ⚠️ 仍不对(ESA 可能缓存了旧头,稍等或 purge)";; esac