3.2.35 CDN 加速加启用开关 + 预制白/黑名单,勾了不填地址拒绝保存 #4
「启用 CDN 加速」复选框放在 CDN 段最前。不勾时下面填什么都不产生作用, 前台与没装该功能完全一致(三个入口 should_rewrite / rewrite_html / buffer_start 都过 yang_cdn_active())。 预制名单写进输入框的 std,用户可直接增删改,保存后以用户内容为准: 白名单 13 项(.avif .css .gif .jpeg .jpg .js .json .mp3 .mp4 .pdf .png .svg .webp);黑名单 13 项安全后缀(.php* .phtml .phar .env .sql .bak .log .ini .sh .htaccess)。同时 yang_cdn_defaults() 给同一份 —— std 在运行时完全不生效,两处不同源就会出现「后台 13 项、前端 0 项」。 勾了开关但地址留空:保存被整单拒绝(validate_options 返回旧值),并 add_settings_error 提示。回调里绝不 update_option(会递归触发 sanitize_option_kratos,3.2.11 吃爆内存的路径)。另加 admin_init 进页面 提示,救「勾着但地址空」的老站点。 开关默认值按「地址是否非空」推算,老站点升级不丢加速;没填过地址的站点 默认不勾,避免第一次点保存就被「必须填地址」拦住。 顺带修掉 parse_url 对主机过于宽容导致的畸形地址(https://not a url at all 曾被当合法,会把全站静态资源拼成畸形地址)。 验证:_cdn335_logic.php 116/0 · _cdn335_falsify.php 22/0 · _admin335_cdn_check.py 74/0 · _admin335_falsify.py 23/0 · _pkgcheck335.py 117/0 · _pkgcheck335_falsify.py 27/0 · _cdn334_logic.php 92/0(向后兼容)· _cdn334_falsify.php 21/0
This commit is contained in:
+58
-12
@@ -872,15 +872,27 @@ function kratos_options()
|
||||
);
|
||||
|
||||
/* ══════════════════════════════════════════════════════════
|
||||
* 十二、CDN 加速 —— 三个输入框,不多加
|
||||
* 十二、CDN 加速 —— 一个开关 + 两个名单
|
||||
*
|
||||
* 用户明确要求「一共就这 3 个选项,不要弄得太复杂」。
|
||||
* 所以这里没有开关、没有自动开关、没有服务商选择,只有:
|
||||
* CDN 地址 / 白名单 / 黑名单
|
||||
* 地址留空 = 功能关闭。这比再加一个「启用」勾选框更省事,
|
||||
* 也不会出现「勾了启用但没填地址」这种半配置状态。
|
||||
* 3.2.34 原设计是「地址留空即关闭」,没有开关。本版(3.2.35)
|
||||
* 按用户要求补了三件事:
|
||||
* ① 「启用 CDN 加速」复选框,作为总开关
|
||||
* ② 白名单预填 13 类静态资源后缀(用户可改)
|
||||
* ③ 黑名单预填安全相关后缀(用户可改)
|
||||
*
|
||||
* ── 预制内容为什么放在输入框里而不是硬编码 ──────────────────
|
||||
* 用户明确选了这条路:「预制的这些就放在白名单的输入框里,
|
||||
* 这样用户就可以直接修改;修改完之后,我们再把它保存下来,
|
||||
* 按照用户修改的来执行。」
|
||||
*
|
||||
* 所以预制内容写在 std 里 —— 它只服务两件事:
|
||||
* · 后台首次渲染时预填
|
||||
* · 点「恢复默认」时还原成这份内容
|
||||
* 一旦用户保存过,库里就有明确的值,运行时读的是库里的值,
|
||||
* 主题**不会**再去覆盖用户改过的内容。
|
||||
*
|
||||
* 匹配逻辑(写进说明里,让用户看得到):
|
||||
* 开关没勾 → 整个功能关闭,两套名单都不参与
|
||||
* 先看黑名单 → 命中就保持原地址
|
||||
* 黑名单没命中 → 再看白名单
|
||||
* 黑名单优先级高于白名单
|
||||
@@ -890,20 +902,49 @@ function kratos_options()
|
||||
'type' => 'heading',
|
||||
);
|
||||
|
||||
/*
|
||||
* 开关必须是本段的第一个控件。
|
||||
*
|
||||
* std 用 yang_cdn_enable_default()(地址非空 ⇒ 默认勾选),
|
||||
* 目的是**老站点升级不丢加速**:3.2.34 的站点只要填过地址就
|
||||
* 一直在加速,升级后若默认不勾,它会静默失去加速,而用户不会
|
||||
* 去查一个从没动过的复选框。
|
||||
*/
|
||||
$options[] = array(
|
||||
'name' => __('启用 CDN 加速', 'kratos'),
|
||||
'desc' => __('勾选后功能才生效。<b>没勾时,下面填什么都不产生作用</b>,前台与不装这个功能完全一致。'
|
||||
. '<br>勾了但 CDN 地址留空是<b>不允许</b>的:点保存会被拦下来并提示必须填地址。', 'kratos'),
|
||||
'id' => 'cdn_enable',
|
||||
'std' => function_exists('yang_cdn_enable_default') ? yang_cdn_enable_default() : false,
|
||||
'type' => 'checkbox',
|
||||
);
|
||||
|
||||
$options[] = array(
|
||||
'name' => __('CDN 地址', 'kratos'),
|
||||
'desc' => __('资源的加速前缀,例如 <code>https://cdn.example.com</code>。可以不带协议(自动按 https 补全)。<b>留空即关闭整个功能</b>,站点行为与不装这项功能完全一致。', 'kratos'),
|
||||
'desc' => __('资源的加速前缀,例如 <code>https://cdn.example.com</code>。可以不带协议(自动按 https 补全)。'
|
||||
. '<b>勾选了上面的开关,这一项就必须填</b>。', 'kratos'),
|
||||
'id' => 'cdn_url',
|
||||
'std' => '',
|
||||
'type' => 'text',
|
||||
'placeholder' => 'https://cdn.example.com',
|
||||
);
|
||||
|
||||
/*
|
||||
* 白名单的 std 就是预制清单。
|
||||
*
|
||||
* ⚠️ std 在运行时**完全不生效**(kratos_option 只查库),所以
|
||||
* 这里只负责「后台预填」与「恢复默认」。运行时若库里没有这个键,
|
||||
* 由 yang_cdn_defaults() 提供同一份内容 —— 两处必须一致,
|
||||
* 否则会出现"后台显示 13 项、运行时按 0 项算"的错位。
|
||||
*/
|
||||
$options[] = array(
|
||||
'name' => __('白名单', 'kratos'),
|
||||
'desc' => __('命中这些规则的文件<b>才</b>走 CDN。一行一条,<code>#</code> 或 <code>;</code> 开头的行是注释。<b>留空 = 所有静态文件都走 CDN</b>。', 'kratos'),
|
||||
'desc' => __('命中这些规则的文件<b>才</b>走 CDN。一行一条,<code>#</code> 或 <code>;</code> 开头的行是注释。'
|
||||
. '<br><b>这里已经预填了 13 类常用静态资源</b>,你可以直接改、加、删,保存后按你改的执行。'
|
||||
. '<br>⚠️ 把它全部删空 = <b>所有静态文件都走 CDN</b>(不只是下面这 13 类)。'
|
||||
. '不想让字体、图标字体之类的走 CDN,就把 <code>*</code> 换成具体后缀。', 'kratos'),
|
||||
'id' => 'cdn_include',
|
||||
'std' => '',
|
||||
'std' => function_exists('yang_cdn_preset_text') ? yang_cdn_preset_text(yang_cdn_preset_include()) : '',
|
||||
'type' => 'code',
|
||||
'settings' => array('rows' => 10),
|
||||
);
|
||||
@@ -917,15 +958,20 @@ function kratos_options()
|
||||
. '<br><code>/wp-content/uploads/</code> —— 以这个路径开头(以斜杠开头、不含星号)'
|
||||
. '<br><code>*/uploads/*</code> —— 通配符,<code>*</code> 可以跨斜杠'
|
||||
. '<br><code>uploads</code> —— 路径里含这几个字(子串)'
|
||||
. '<br><code>~\/20\d\d\/~</code> —— 正则,对完整地址匹配',
|
||||
. '<br><code>~\/20\d\d\/~</code> —— 正则,对完整地址匹配'
|
||||
. '<br><br>扩展到字体也很常见:加一行 <code>.woff2 .woff .ttf .eot .otf</code> 即可。',
|
||||
'type' => 'info',
|
||||
);
|
||||
|
||||
$options[] = array(
|
||||
'name' => __('黑名单', 'kratos'),
|
||||
'desc' => __('命中的文件<b>即使符合白名单也不走 CDN</b>,保持原地址。一行一条,写法与白名单完全相同。<b>黑名单优先于白名单</b>:两边都命中时按黑名单处理。', 'kratos'),
|
||||
'desc' => __('命中的文件<b>即使符合白名单也不走 CDN</b>,保持原地址。一行一条,写法与白名单完全相同。'
|
||||
. '<b>黑名单优先于白名单</b>:两边都命中时按黑名单处理。'
|
||||
. '<br><b>这里已经预填了安全相关的后缀</b>(<code>.php</code> <code>.env</code> <code>.sql</code> <code>.bak</code> <code>.log</code> 等)—— '
|
||||
. '它们一旦被推到第三方 CDN 节点上,等于把配置、数据库备份、错误日志公开了。'
|
||||
. '<b>建议保留这行</b>,即使白名单写的是 <code>*</code>。', 'kratos'),
|
||||
'id' => 'cdn_exclude',
|
||||
'std' => '',
|
||||
'std' => function_exists('yang_cdn_preset_text') ? yang_cdn_preset_text(yang_cdn_preset_exclude()) : '',
|
||||
'type' => 'code',
|
||||
'settings' => array('rows' => 10),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user