在主题设置里新增一个 CDN 加速 标签页,参考 CDN Enabler 插件做一个精简版。
https://cdn.example.com
一行一条,匹配对象是 URL 的路径部分(正则规则除外,它对完整 URL 匹配)。 # 或 ; 开头的行视为注释,空行忽略。
#
;
*
jpg
.jpg
*.jpg
jpg,png,webp
.jpg .png
/wp-content/uploads/
/
*/uploads/*
/wp-content/themes/*/assets/*
uploads
wp-content
~\/\d{4}\/\d{2}\/~
~...~
preg_match
下面这些永远不改写,否则站点会被改坏:
.php
.html
.htm
wp-admin
wp-login
wp-json
wp-cron
视为「全部静态文件都走 CDN」。理由:与 CDN Enabler 一致(只填一个 CDN 地址就能用), 也符合"只想加速、不想逐条配规则"的常见用法。这条要写进后台说明文字里,避免误解。
src
href
srcset
url()
//example.com/...
data:
mailto:
tel:
javascript:
a.css?ver=1.2
ASSET_PATH
kratos
版本已发到 theme-update/,后台「主题设置」里能看到「CDN 加速」标签页(在「邮件通知」之后、「自定义代码」之前)。
theme-update/
按需求只做了三样,没有加启用开关:
之所以不另加「启用」勾选框:那会多出一种半配置状态(勾了启用、地址忘填),看着是开着的、实际毫无效果。把「填了才生效」写进逻辑,省掉一次误判。
* 全部静态文件 jpg / .jpg / *.jpg 按扩展名 jpg,png,webp 一串扩展名,命中任一 /wp-content/uploads/ 以这个路径开头 */uploads/* 通配符,* 可跨斜杠 uploads 路径里含这几个字 ~\/20\d\d\/\d\d\/~ 正则,对完整地址匹配 # 或 ; 开头 注释
jpg 和 uploads 在字面上都是「一串纯字母」,分不出谁是扩展名、谁是路径片段。若一律当扩展名,uploads 这条会完全失效,而且没有任何提示 —— 用户只会看到"规则没反应",最难查。
处理办法:单个词同时按两种含义匹配(jpg 按扩展名命中 .jpg 文件;uploads 按路径子串命中 /wp-content/uploads/ 下的文件)。两个含义天然互斥,同时挂上不产生歧义。多个词(jpg,png)只按扩展名列表处理。
jpg,png
后台、REST、AJAX、feed、WP-Cron、定制器预览、命令行一律不改写(后台改了会导致编辑器里看不到真实图片,REST 返回的地址与库对不上)。
?ver= 这类查询串原样保留 —— 丢了浏览器会一直吃 CDN 上的旧缓存,改了样式前台看不见,是这类功能最常见的事故。
?ver=
站点装在子目录(example.com/blog/...)时,判规则用完整路径、拼 CDN 时剥掉子目录,所以规则照原路径写就行,不用为子目录改一遍。
example.com/blog/...
反向验证过程中抓出三处真实盲点(不是产品 bug,是我的判据不够):
data:image/png;base64,...
data:image/png;base64.a.jpg
//other-site.com/a.jpg
max()
crashed()
40e09b6
kratos_yang-3.2.34.zip
ba4155dfaf29c37f958d26888ffc3c37
theme-cdn.php
3.2.34 已上线并稳定运行(线上 3.2.34 前台正常,58 个静态资源走 CDN)。用户确认可以关单。
后续在 #4 里追加了「启用开关 + 预制名单」,随 v3.2.35 一起发布。
No dependencies set.
The note is not visible to the blocked user.
需求
在主题设置里新增一个 CDN 加速 标签页,参考 CDN Enabler 插件做一个精简版。
只要三个配置项,不要更多
https://cdn.example.com匹配逻辑(用户原话整理)
期望的规则语法(本次确定)
一行一条,匹配对象是 URL 的路径部分(正则规则除外,它对完整 URL 匹配)。
#或;开头的行视为注释,空行忽略。*jpg/.jpg/*.jpgjpg,png,webp或.jpg .png/wp-content/uploads/(以/开头、不含*)*/uploads/*、/wp-content/themes/*/assets/**可跨/uploads、wp-content~\/\d{4}\/\d{2}\/~~...~包裹,对完整 URL 做preg_match安全底线(不受规则影响,硬编码)
下面这些永远不改写,否则站点会被改坏:
/结尾的地址(页面、栏目页)—— 改成 CDN 会导致导航跳到 CDN、404。.php/.html/.htm等动态或页面类后缀。wp-admin、wp-login、wp-json、wp-cron等后台与接口路径。白名单为空时的行为
视为「全部静态文件都走 CDN」。理由:与 CDN Enabler 一致(只填一个 CDN 地址就能用),
也符合"只想加速、不想逐条配规则"的常见用法。这条要写进后台说明文字里,避免误解。
验收标准
功能
改写正确性
src/href/srcset/ 内联样式url()等出现资源地址的地方生效,不改页面链接。//example.com/...)都能改;data:/mailto:/tel:/javascript:不动。a.css?ver=1.2)改写后查询串原样保留。不破坏既有能力
不改什么
ASSET_PATH的既有语义(那是主题自身资源前缀,与本功能是两条独立的路径)。kratos这一个 option)。3.2.34 已发布
版本已发到
theme-update/,后台「主题设置」里能看到「CDN 加速」标签页(在「邮件通知」之后、「自定义代码」之前)。落地形态
按需求只做了三样,没有加启用开关:
之所以不另加「启用」勾选框:那会多出一种半配置状态(勾了启用、地址忘填),看着是开着的、实际毫无效果。把「填了才生效」写进逻辑,省掉一次误判。
规则写法(一行一条,按字面形态自动识别,不用记语法)
有一个歧义必须专门解决
jpg和uploads在字面上都是「一串纯字母」,分不出谁是扩展名、谁是路径片段。若一律当扩展名,uploads这条会完全失效,而且没有任何提示 —— 用户只会看到"规则没反应",最难查。处理办法:单个词同时按两种含义匹配(
jpg按扩展名命中 .jpg 文件;uploads按路径子串命中 /wp-content/uploads/ 下的文件)。两个含义天然互斥,同时挂上不产生歧义。多个词(jpg,png)只按扩展名列表处理。硬性排除(两套名单都改不了,因为改坏的方式极其致命)
后台、REST、AJAX、feed、WP-Cron、定制器预览、命令行一律不改写(后台改了会导致编辑器里看不到真实图片,REST 返回的地址与库对不上)。
?ver=这类查询串原样保留 —— 丢了浏览器会一直吃 CDN 上的旧缓存,改了样式前台看不见,是这类功能最常见的事故。站点装在子目录(
example.com/blog/...)时,判规则用完整路径、拼 CDN 时剥掉子目录,所以规则照原路径写就行,不用为子目录改一遍。验证
M15 逐条注入 + E1E3 等价重写)A12 注入 + E1E2 等价重写)反向验证过程中抓出三处真实盲点(不是产品 bug,是我的判据不够):
data:协议排除:原用例data:image/png;base64,...经 parse_url 后没有扩展名,被「无扩展名」那条顺带挡住了 ⇒ 拆掉协议排除也仍绿。补了一条带扩展名的data:image/png;base64.a.jpg,只有协议排除拦得住。//other-site.com/a.jpg这条只走协议相对分支的用例。max()空集合抛 ValueError),崩了没有 FAIL 行,反向验证会把它误判成"注入被抓住了"。加了crashed()前置判定 + 空集时只报一条红。交付
40e09b6(信息带 #3),已推 mainkratos_yang-3.2.34.zip4133853 B,md5ba4155dfaf29c37f958d26888ffc3c37theme-cdn.php727 行,readme 顶部是 V3.2.34,历史 24 条版本标题全保留theme-update/三个文件,未解包覆盖服务器主题目录(3.2.24 起的约定),升级请在 WP 后台自行点更新3.2.34 已上线并稳定运行(线上 3.2.34 前台正常,58 个静态资源走 CDN)。用户确认可以关单。
后续在 #4 里追加了「启用开关 + 预制名单」,随 v3.2.35 一起发布。