Files
SimpleNav/config.php
T
laoyang 853e4dd7c6 feat: 图标策略升级 + 引擎显隐就地切换 + 前后台一致性;界面美化
按反馈逐条处理:

① 界面美化
- 前台重做:品牌区(logo + 站名 + 副标题)、胶囊式引擎切换、圆角卡片与
  悬停浮起、聚焦光晕、合集标签页淡入动画;版心改为 shell 变量
  (--pad-x = max(gutter, (100% - wrap)/2)),与顶栏左右边缘严格对齐。
- 后台:表格窄屏可横向滚动、状态胶囊、自定义徽章、图标预览框。

② 自动更新图标质量差 + 允许自定义图标
- 抓取改为阶梯择优:manifest 512/192 → apple-touch-icon → <link rel=icon>
  (按 sizes 降序,SVG 视为最高清)→ 第三方聚合服务(favicon.yandex.net
  实测 100% 可用;icon.horse 可达时最高 256px)→ 站点自身 /favicon.ico。
- 逐个候选实测像素,达到 120px 即停;候选上限 8 个 + 10s 总预算,避免超时。
- 用 GD 只缩不放,统一存成 128×128 PNG;识别并丢弃第三方服务的
  「灰底字母」占位块。
- 新增 sites.icon_custom 列(带幂等迁移):可上传图标或填图标地址;
  一旦自定义,「全部更新」只刷新名称、跳过图标。

③ 后台引擎「可见/不可见」不好用
- 小图标换成内联 SVG(原来用 emoji,跨字体显示成方块)。
- 切换改为 AJAX 原地生效 + 状态胶囊同步,不再点一下就跳页;
  所有切换/移动表单都带 p 参数,无 JS 时也能正确回到当前页。
- 修掉一个隐蔽的成因:本站此前完全不发 Cache-Control/Expires/ETag,
  浏览器只能自行猜测缓存策略,导致「改完刷新还是旧的」。现在所有动态页
  统一发 no-store/no-cache。

④ deploy/ 与 data/ 误入版本库
- 两目录整目录忽略,部署脚本移出仓库(存 _tooling/),已 git rm --cached。
  (历史提交里仍含这些文件,如需彻底抹除需 git filter-repo,待确认。)

附带修复(线上实测驱动)
- 服务器侧页面缓存:宝塔「网站加速」Apache(mod_lua) 版是一层基于 memcached
  的 30 秒整页缓存,且**读不到 FastCGI 返回的 Cache-Control**,所以 no-store
  挡不住它;唯一信号是请求 cookie X_CACHE=1。已在根 .htaccess 用
  RequestHeader 在请求侧注入该标记(实测任何访客均 X-Cache: MISS),
  PHP 侧另发一颗 cookie 作为 Nginx 环境的兜底(BYPASS_PAGE_CACHE 开关)。
- 静态资源改为「长缓存 + 版本号」:asset()/icon_src() 拼 mtime+size,
  assets/.htaccess 与根 .htaccess 给出 max-age=31536000 immutable。
- 修 absolutize() 未还原 JSON 转义 \/ 导致部分图标 URL 抓不下来的问题。
- 修部署脚本 md5sum 在 Git Bash 下输出 "hash *path" 导致 38 项假「缺失文件」。
2026-09-28 16:43:10 +08:00

79 lines
2.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* 简航 SimpleNav —— 基础配置
* 面向个人的轻量级网站导航系统
*/
declare(strict_types=1);
date_default_timezone_set('Asia/Shanghai');
if (function_exists('mb_internal_encoding')) {
mb_internal_encoding('UTF-8');
}
define('APP_NAME', '简航');
define('APP_PATH', __DIR__);
define('DATA_PATH', APP_PATH . '/data'); // 数据库等敏感数据(禁止 Web 访问)
define('DB_PATH', DATA_PATH . '/nav.db');
define('ICON_PATH', APP_PATH . '/uploads/icons'); // 抓取的网站图标(可公开访问)
define('ICON_URL', 'uploads/icons'); // 相对站点根
define('ICON_STORE', 128); // 图标统一存成 128×128(高清屏下 45~64px 显示仍锐利)
/**
* 是否「由 PHP 再发一颗」绕开服务器侧页面缓存的标记 cookie。
*
* 背景(2026-09-28 线上实测):服务器装了宝塔面板的「网站加速」,它是一层基于
* memcached 的整页缓存,本站在其 n.yangyq.net 配置里的过期时间是 30 秒。实测它
* **读不到** FastCGI 后端返回的 `Cache-Control` 响应头,所以 `no-store` 之类对它
* 无效;它唯一认的信号是**请求** cookie `X_CACHE=1`。
*
* 主要解法在根目录 `.htaccess` 里(用 `RequestHeader` 在请求侧注入该标记),
* 对所有访客一次生效、无需 PHP 配合;下面这个开关是**第二道保险**,
* 用于 Nginx 等不读 .htaccess 的环境。
*
* true = 动态页顺带把该 cookie 种到访客浏览器(首次访问各发一次)
* false = 只发响应头,完全依赖 .htaccess / 服务器配置
*/
define('BYPASS_PAGE_CACHE', true);
/**
* 自动探测应用根 URL,兼容「放在子目录 /simplenav」与「放在根目录」两种部署。
* 返回形如 ''(根目录)或 '/simplenav'。
*/
function app_base(): string
{
$dir = isset($_SERVER['SCRIPT_NAME']) ? $_SERVER['SCRIPT_NAME'] : '/';
$dir = str_replace('\\', '/', dirname($dir));
$dir = preg_replace('#/admin$#', '', $dir); // admin/ 下的脚本回退到应用根
$dir = rtrim($dir, '/');
return $dir === '/' ? '' : $dir;
}
/** 生成带应用根的 URL */
function url(string $path = ''): string
{
return app_base() . '/' . ltrim($path, '/');
}
/** 站点名(可在后台设置里覆盖) */
function site_name(): string
{
return setting('site_name', APP_NAME);
}
/** 读取设置项 */
function setting(string $key, string $default = ''): string
{
static $cache = null;
if ($cache === null) {
$cache = [];
try {
foreach (db()->query('SELECT k, v FROM settings') as $row) {
$cache[$row['k']] = $row['v'];
}
} catch (Throwable $e) {
$cache = [];
}
}
return array_key_exists($key, $cache) && $cache[$key] !== '' ? $cache[$key] : $default;
}