/...),浏览器直接取静态文件,最快。 * 但在**站点目录不可写**的保守环境里写不了文件,此时整套图片被压进 settings, * 由这个端点按需吐出 —— 功能不至于因为权限限制而整个不能用。 * * 用法: * ?n=logo → 首页品牌图标 * ?n=icon-192 → PWA 图标 * ?n=icon-192-maskable * ?n= (不带 n) → favicon.ico(多帧) * 任何情况下都只吐「当前设置里那一套」,取不到就 404,绝不暴露路径。 */ declare(strict_types=1); require_once __DIR__ . '/functions.php'; $name = isset($_GET['n']) ? (string)$_GET['n'] : ''; // 白名单:只允许清单里的名字(外加 favicon.ico),杜绝路径穿越 $plan = site_icon_plan(); $allow = []; foreach (array_keys($plan) as $k) { $allow[$k . '.png'] = 'image/png'; } $allow['favicon.ico'] = 'image/x-icon'; if ($name === '') { $file = 'favicon.ico'; } else { $file = $name . '.png'; } if (!isset($allow[$file])) { http_response_code(404); exit; } $all = site_icon_all(); if (!isset($all[$file]) || $all[$file] === '') { http_response_code(404); exit; } $bin = (string)$all[$file]; header('Content-Type: ' . $allow[$file]); header('Content-Length: ' . strlen($bin)); // 图标内容只随「上传」变化,键(?v=)一变就会换 URL —— 可以放心长缓存 header('Cache-Control: public, max-age=31536000, immutable'); echo $bin;