From 9b4ffce9a57afa9d35b1a4273191b60332f6afe5 Mon Sep 17 00:00:00 2001
From: liuzhuohua <29739020+liuzhuohua@users.noreply.github.com>
Date: Wed, 30 Sep 2026 23:14:19 +0800
Subject: [PATCH] =?UTF-8?q?feat(devtools):=20=E7=94=9F=E6=88=90=E6=88=AA?=
=?UTF-8?q?=E5=9B=BE=E5=9B=BE=E5=BA=8A=E5=A4=96=E9=93=BE=E6=B8=85=E5=8D=95?=
=?UTF-8?q?=EF=BC=88Markdown=20/=20BBCode=20/=20HTML=20=E4=B8=89=E6=A0=BC?=
=?UTF-8?q?=E5=BC=8F=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
用户问「能不能当图床、转成论坛可用的格式」。
实测结论:可以。四种直链形式全部 200,且
- Content-Type 正确(image/jpeg)
- Access-Control-Allow-Origin: *(CORS 全开,网页引用无阻)
- 无防盗链:带外部 Referer、无 UA 均正常返回
新增 devtools/gen-image-urls.py,一次性产出三种论坛格式:
① Markdown  GitHub / 语雀 / Discourse / Obsidian
② BBCode [img]url[/img] Discuz / phpBB / NGA / 恩山 / Chiphell / v2ex
③ HTML
博客 / 自建站 / 富文本编辑器
域名默认用 cdn.jsdelivr.net/gh —— 国内可达性明显好于
raw.githubusercontent.com,且缓存 7 天(raw 只有 5 分钟)。
文档里附了换域名对照表(gcore 备用节点 / statically / raw)。
同时支持 @ 冻结写法,把内容锁定在某个提交上,
避免后续提交把已发出去的帖子里的图改掉。
产物同时落在 docs/图床链接清单.md(进仓库)和桌面(方便直接用)。
顺带记录一个失败:想生成「纯格式版」和「带文件名版」两份,
判断逻辑写错导致两份内容相同;改用一次生成、分节呈现,
反而更适合「整段复制」的用法。别为了参数化而增加无意义的重复产物。
---
devtools/gen-image-urls.py | 127 +++++++++++++
docs/图床链接清单.md | 380 +++++++++++++++++++++++++++++++++++++
2 files changed, 507 insertions(+)
create mode 100644 devtools/gen-image-urls.py
create mode 100644 docs/图床链接清单.md
diff --git a/devtools/gen-image-urls.py b/devtools/gen-image-urls.py
new file mode 100644
index 0000000..2653ff2
--- /dev/null
+++ b/devtools/gen-image-urls.py
@@ -0,0 +1,127 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+把 docs/screenshots/ 里的截图生成「论坛可直接贴」的三种格式 URL 清单。
+
+三种格式覆盖主流论坛:
+ 1. Markdown  —— GitHub / 语雀 / Obsidian / 少数派 / Discourse
+ 2. BBCode [img]url[/img] —— Discuz / phpBB / NGA / 恩山 / Chiphell / v2ex
+ 3. HTML
—— 博客 / 自建站 / 富文本编辑器
+
+URL 用两种:
+ - 浮动版 @main :仓库更新后自动跟着变(想"永远最新"用这个)
+ - 冻结版 @ :锁定到某个 commit,永不改变(想"发出去的帖子永远一致"用这个)
+
+为什么默认推荐 jsDelivr:
+ 它挂了 CORS、CDN 缓存 7 天、国内可达性明显好于 raw.githubusercontent.com。
+ raw 也可以,但国内部分网络会连不上(被墙/被限速),帖子图片就成了白框。
+"""
+import os
+import subprocess
+import sys
+
+ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+SHOTS = os.path.join(ROOT, "docs", "screenshots")
+
+OWNER = "liuzhuohua"
+REPO = "drouter"
+BRANCH = "main"
+
+# 缩略图说明:供 --with-caption 用,读取 shots-map 的图注
+sys.path.insert(0, os.path.join(ROOT, "devtools"))
+
+
+def load_captions():
+ import importlib.util
+ spec = importlib.util.spec_from_file_location(
+ "sm", os.path.join(ROOT, "devtools", "shots-map.py"))
+ sm = importlib.util.module_from_spec(spec)
+ spec.loader.exec_module(sm)
+ return {dst[:-4] if dst.endswith(".jpg") else dst: cap for _, dst, cap in sm.MAP}
+
+
+def jsdelivr(ref, path):
+ # jsDelivr 的 GitHub 形式:/gh//@[/
+ return "https://cdn.jsdelivr.net/gh/%s/%s@%s/%s" % (OWNER, REPO, ref, path)
+
+
+def raw(ref, path):
+ return "https://raw.githubusercontent.com/%s/%s/%s/%s" % (OWNER, REPO, ref, path)
+
+
+def main():
+ withcap = "--with-caption" in sys.argv
+ commit = subprocess.run(["git", "rev-parse", "HEAD"],
+ cwd=ROOT, capture_output=True, text=True).stdout.strip()
+ files = sorted(f for f in os.listdir(SHOTS) if f.lower().endswith(".jpg"))
+ caps = load_captions()
+
+ def emit(title, urlfn, fmt):
+ print("=" * 96)
+ print("【%s】 base=%s" % (title, urlfn(BRANCH, "docs/screenshots/").split("/docs/")[0]))
+ print("=" * 96)
+ for f in files:
+ p = "docs/screenshots/" + f
+ u = urlfn(BRANCH, p)
+ cap = caps.get(f[:-4], f)
+ if fmt == "md":
+ line = "" % (cap, u)
+ elif fmt == "bb":
+ line = "[img]%s[/img]" % u
+ else:
+ line = ']
' % (u, cap)
+ if withcap:
+ print("%-28s %s" % (f, line))
+ else:
+ print(line)
+ print()
+
+ print("# Drouter 截图外链清单")
+ print("# 仓库: https://github.com/%s/%s" % (OWNER, REPO))
+ print("# 图片: %d 张,位于 docs/screenshots/" % len(files))
+ print("# 冻结版本 commit: %s" % commit)
+ print("#")
+ print("# 用法:三种格式任选其一,直接整段复制到论坛/博客编辑器即可。")
+ print("# 域名说明见文末「该用哪个域名」。")
+ print()
+
+ emit("① Markdown 格式 — GitHub / 语雀 / Discourse / Obsidian", jsdelivr, "md")
+ emit("② BBCode 格式 — Discuz / phpBB / NGA / 恩山 / Chiphell / v2ex", jsdelivr, "bb")
+ emit("③ HTML 格式 — 博客 / 自建站 / 富文本编辑器", jsdelivr, "html")
+
+ print("=" * 96)
+ print("该用哪个域名")
+ print("=" * 96)
+ print("""
+ 域名 国内可达 缓存 建议
+ ---------------------------------- -------- ------- --------------------------
+ cdn.jsdelivr.net/gh/... 好 7 天 首选,本文档默认
+ raw.githubusercontent.com/... 时好时坏 5 分钟 备选;国内可能连不上
+ github.com/..../raw/main/... 同上 5 分钟 不推荐(多一次 302 跳转)
+ cdn.statically.io/gh/... 较好 1 天 备选 CDN
+ gcore.jsdelivr.net/gh/... 好 7 天 jsDelivr 备用节点(主站被墙时)
+
+ 实测结论(2026-09-30):四种形式全部 200 且 CORS 全开、无防盗链,
+ 带外部 Referer 也能正常返回图片。可以放心当图床。
+
+ 想换域名:把 URL 里的 `cdn.jsdelivr.net/gh` 换成上表任一即可,
+ 其余部分原样保留。
+
+ ⚠️ 关于「冻结版」(把 @main 换成 @):
+ GitHub 的图床链接一旦仓库被删/改名就失效。若帖子要长期留存,
+ 建议本地也存一份原图,或者用 @ 形式锁定 —— 至少内容不会被
+ 后续提交改变(但仓库删除依然会失效)。
+""")
+
+ print("=" * 96)
+ print("冻结版(@%s)示例 —— 前 3 张" % commit[:8])
+ print("=" * 96)
+ for f in files[:3]:
+ p = "docs/screenshots/" + f
+ print(" %-24s %s" % (f, raw(commit, p)))
+ print()
+ print(" 全文冻结版生成:把本脚本里 BRANCH 换成 commit sha 再跑一次")
+
+
+if __name__ == "__main__":
+ main()
diff --git a/docs/图床链接清单.md b/docs/图床链接清单.md
new file mode 100644
index 0000000..11a2b89
--- /dev/null
+++ b/docs/图床链接清单.md
@@ -0,0 +1,380 @@
+# Drouter 78 张截图 · 图床链接清单(纯格式,可整段复制)
+
+> 仓库:https://github.com/liuzhuohua/drouter
+> 锁定 commit:`3f5f31701ee64b9419456b3c24b3e02fbfccb0c4`
+> 图片数:78 张 · 默认域名 `cdn.jsdelivr.net`(国内可达 + CDN 缓存 7 天 + CORS 全开)
+
+---
+
+## 一、Markdown 格式
+
+> 适用:GitHub、语雀、Obsidian、少数派、Discourse、Notion
+
+```markdown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+## 二、BBCode 格式
+
+> 适用:Discuz、phpBB、NGA、恩山、Chiphell、v2ex、吾爱破解
+
+```bbcode
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/01-login.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-netstat-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-netstat-3.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-netstat.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-overview-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-overview-3.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-overview.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-iface.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-lan.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-pppoe-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-pppoe.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-vlan.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-wan-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-wan-3.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-wan.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-wol.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ddns-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ddns-3.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ddns.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-dhcp-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-dhcp.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-dhcpv6.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-dns.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ipv6ra-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ipv6ra-3.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ipv6ra.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-publicip-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-publicip.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-acl.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-dnat.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-fw4-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-fw4.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-fw6-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-fw6.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-upnp.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-acap-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-acap.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-cups-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-cups-3.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-cups-4.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-cups.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-dpi-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-dpi.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-ntp.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-qos-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-qos.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-smb-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-smb.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-api-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-api.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-diag.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-docker-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-docker-3.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-docker.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-dockerconf-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-dockerconf-3.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-dockerconf.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-ipv6test.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-webshell.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/08-flowlog-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/08-flowlog.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/08-syslog.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-cleanup-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-cleanup.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-deps-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-deps.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-kernel-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-kernel.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-power.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-settings-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-settings-3.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-settings-4.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-settings.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-tls-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-tls-3.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-tls.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-user-2.jpg[/img]
+[img]https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-user.jpg[/img]
+```
+
+## 三、HTML 格式
+
+> 适用:博客、自建站、富文本编辑器(WordPress / Typecho / Hexo)
+
+```html
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+---
+
+## 单独取某一张的 URL
+
+| # | 页面 | 文件名 | URL |
+|---|---|---|---|
+| 1 | 登录页 | `01-login.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/01-login.jpg |
+| 2 | 网络状态 · 路由表与接口地址 | `02-netstat-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-netstat-2.jpg |
+| 3 | 网络状态 · flowtable 软加速 | `02-netstat-3.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-netstat-3.jpg |
+| 4 | 网络状态 / 加速 | `02-netstat.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-netstat.jpg |
+| 5 | 系统概览 · 硬件仪表盘 | `02-overview-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-overview-2.jpg |
+| 6 | 系统概览 · 网络与服务状态 | `02-overview-3.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-overview-3.jpg |
+| 7 | 系统概览 | `02-overview.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/02-overview.jpg |
+| 8 | 网卡与桥接 | `03-iface.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-iface.jpg |
+| 9 | LAN 口 | `03-lan.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-lan.jpg |
+| 10 | PPPoE 多拨 · 会话状态 | `03-pppoe-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-pppoe-2.jpg |
+| 11 | PPPoE 多拨 | `03-pppoe.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-pppoe.jpg |
+| 12 | VLAN / IPTV 单线复用 | `03-vlan.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-vlan.jpg |
+| 13 | WAN 口 · 实时状态 | `03-wan-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-wan-2.jpg |
+| 14 | WAN 口 · 拨号日志 | `03-wan-3.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-wan-3.jpg |
+| 15 | WAN 口 · 接入方式 | `03-wan.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-wan.jpg |
+| 16 | 网络唤醒 WOL | `03-wol.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/03-wol.jpg |
+| 17 | 动态域名 DDNS · IPv6 记录 | `04-ddns-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ddns-2.jpg |
+| 18 | 动态域名 DDNS · 解析结果 | `04-ddns-3.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ddns-3.jpg |
+| 19 | 动态域名 DDNS | `04-ddns.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ddns.jpg |
+| 20 | DHCP 服务 · 租约表 | `04-dhcp-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-dhcp-2.jpg |
+| 21 | DHCP 服务 | `04-dhcp.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-dhcp.jpg |
+| 22 | DHCPv6 / 前缀委派 | `04-dhcpv6.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-dhcpv6.jpg |
+| 23 | DNS 服务 | `04-dns.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-dns.jpg |
+| 24 | IPv6 / RA · 前缀与 RDNSS | `04-ipv6ra-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ipv6ra-2.jpg |
+| 25 | IPv6 / RA · 运行状态 | `04-ipv6ra-3.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ipv6ra-3.jpg |
+| 26 | IPv6 / RA | `04-ipv6ra.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-ipv6ra.jpg |
+| 27 | 真·公网 IP 判定 · NAT 类型 | `04-publicip-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-publicip-2.jpg |
+| 28 | 真·公网 IP 判定 | `04-publicip.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/04-publicip.jpg |
+| 29 | 访问控制 / 时间组 | `05-acl.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-acl.jpg |
+| 30 | 端口转发 / DMZ | `05-dnat.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-dnat.jpg |
+| 31 | 防火墙 IPv4 · 规则与日志 | `05-fw4-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-fw4-2.jpg |
+| 32 | 防火墙 IPv4 | `05-fw4.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-fw4.jpg |
+| 33 | 防火墙 IPv6 · 规则与日志 | `05-fw6-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-fw6-2.jpg |
+| 34 | 防火墙 IPv6 | `05-fw6.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-fw6.jpg |
+| 35 | UPnP / NAT-PMP | `05-upnp.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/05-upnp.jpg |
+| 36 | AC / AP · 无线与 VLAN | `06-acap-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-acap-2.jpg |
+| 37 | AC / AP 管理中心 | `06-acap.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-acap.jpg |
+| 38 | 打印服务 · 打印队列 | `06-cups-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-cups-2.jpg |
+| 39 | 打印服务 · USB 直通 | `06-cups-3.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-cups-3.jpg |
+| 40 | 打印服务 · 共享设置 | `06-cups-4.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-cups-4.jpg |
+| 41 | 打印服务 CUPS | `06-cups.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-cups.jpg |
+| 42 | 应用识别 DPI · 识别结果 | `06-dpi-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-dpi-2.jpg |
+| 43 | 应用识别 DPI | `06-dpi.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-dpi.jpg |
+| 44 | NTP 时间同步 | `06-ntp.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-ntp.jpg |
+| 45 | 智能限速 QoS · 队列与规则 | `06-qos-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-qos-2.jpg |
+| 46 | 智能限速 QoS | `06-qos.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-qos.jpg |
+| 47 | 文件共享 · 共享目录 | `06-smb-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-smb-2.jpg |
+| 48 | 文件共享 SMB / NFS | `06-smb.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/06-smb.jpg |
+| 49 | 通用 API · OpenAPI 文档 | `07-api-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-api-2.jpg |
+| 50 | 通用 API 接口 | `07-api.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-api.jpg |
+| 51 | 网络诊断工具 | `07-diag.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-diag.jpg |
+| 52 | Docker · 容器与镜像 | `07-docker-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-docker-2.jpg |
+| 53 | Docker · Compose 项目 | `07-docker-3.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-docker-3.jpg |
+| 54 | Docker / Compose | `07-docker.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-docker.jpg |
+| 55 | Docker 引擎 · 镜像源测速 | `07-dockerconf-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-dockerconf-2.jpg |
+| 56 | Docker 引擎 · daemon.json | `07-dockerconf-3.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-dockerconf-3.jpg |
+| 57 | Docker 引擎配置 | `07-dockerconf.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-dockerconf.jpg |
+| 58 | IPv6 连通性测试 | `07-ipv6test.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-ipv6test.jpg |
+| 59 | Web 终端 / 文件 | `07-webshell.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/07-webshell.jpg |
+| 60 | 连接与流日志 · conntrack | `08-flowlog-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/08-flowlog-2.jpg |
+| 61 | 连接与流日志 | `08-flowlog.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/08-flowlog.jpg |
+| 62 | 系统日志 | `08-syslog.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/08-syslog.jpg |
+| 63 | 磁盘与日志清理 · 占用明细 | `09-cleanup-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-cleanup-2.jpg |
+| 64 | 磁盘与日志清理 | `09-cleanup.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-cleanup.jpg |
+| 65 | 依赖自检 · 探测结果 | `09-deps-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-deps-2.jpg |
+| 66 | 依赖自检与安装 | `09-deps.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-deps.jpg |
+| 67 | 内核转发 · 开关与联动 | `09-kernel-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-kernel-2.jpg |
+| 68 | 内核转发与加速 | `09-kernel.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-kernel.jpg |
+| 69 | 电源控制 | `09-power.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-power.jpg |
+| 70 | 系统设置 · 时区与主机名 | `09-settings-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-settings-2.jpg |
+| 71 | 系统设置 · Web 端口 | `09-settings-3.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-settings-3.jpg |
+| 72 | 系统设置 · 审计日志 | `09-settings-4.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-settings-4.jpg |
+| 73 | 系统设置 | `09-settings.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-settings.jpg |
+| 74 | 证书 / SSL · 签发与部署 | `09-tls-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-tls-2.jpg |
+| 75 | 证书 / SSL · 握手体检 | `09-tls-3.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-tls-3.jpg |
+| 76 | 证书 / SSL | `09-tls.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-tls.jpg |
+| 77 | 用户与密钥 · SSH 公钥 | `09-user-2.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-user-2.jpg |
+| 78 | 用户与密钥 | `09-user.jpg` | https://cdn.jsdelivr.net/gh/liuzhuohua/drouter@main/docs/screenshots/09-user.jpg |
+
+---
+
+## 换域名
+
+把 URL 里的 `cdn.jsdelivr.net/gh` 整段替换即可,其余原样保留:
+
+| 域名 | 国内可达 | 缓存 | 说明 |
+|---|---|---|---|
+| `cdn.jsdelivr.net/gh` | 好 | 7 天 | **首选**(本文档默认) |
+| `gcore.jsdelivr.net/gh` | 好 | 7 天 | jsDelivr 备用节点,主站被墙时用 |
+| `raw.githubusercontent.com` | 时好时坏 | 5 分钟 | 备选;国内可能连不上 |
+| `cdn.statically.io/gh` | 较好 | 1 天 | 另一个 CDN 备选 |
+
+**冻结版**(把 `@main` 换成 `@3f5f31701ee64b9419456b3c24b3e02fbfccb0c4`):内容永久锁定,不会因后续提交而改变。
+
+```
+https://raw.githubusercontent.com/liuzhuohua/drouter@3f5f31701ee64b9419456b3c24b3e02fbfccb0c4/docs/screenshots/05-fw4.jpg ← raw 域名的冻结写法
+```
+
+> 注意:jsDelivr 的 `@` 也支持,但换成 raw 域名时路径格式不变。
+
+
+---
+
+## 实测结论(2026-09-30)
+
+- 四种直链形式**全部返回 200**,`Content-Type: image/jpeg`
+- `Access-Control-Allow-Origin: *` —— **CORS 全开**,网页引用无阻
+- **无防盗链**:带外部 Referer(如论坛地址)依然正常返回;无 UA 也正常
+- jsDelivr 缓存 7 天,raw 缓存 5 分钟
+
+> ⚠️ 仓库删除或改名后链接会全部失效。帖子要长期留存,建议本地另存一份原图。