51 lines
1.7 KiB
PHP
51 lines
1.7 KiB
PHP
<?php
|
|||
|
|
/**
|
||
|
|
* 简航 SimpleNav —— 动态输出「站点整体图标」
|
||
|
|
*
|
||
|
|
* 为什么需要这个文件:
|
||
|
|
* 上传自定义图标后要生成一整套尺寸(favicon 多尺寸 + PWA 图标)。正常情况会把它们
|
||
|
|
* 写成静态文件(uploads/site/<键>/...),浏览器直接取静态文件,最快。
|
||
|
|
* 但在**站点目录不可写**的保守环境里写不了文件,此时整套图片被压进 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;
|