From 9276ed73584c128a16c344e873a9b36aa5acd68d Mon Sep 17 00:00:00 2001 From: lucanlee Date: Sat, 8 Aug 2026 16:37:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=9C=8B=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PATCH-README.txt | 2 +- app/Core/App.php | 94 +++++++++++++++++++++++++++++++++ app/Core/Theme.php | 2 +- bt-acme-fix.conf | 2 +- bt-nginx-rewrite.conf | 2 +- bt-ssl-dns.md | 22 ++++---- install/seed.php | 2 +- public/.user.ini | 4 +- robots.txt | 2 +- storage/sessions/.gitkeep | 1 + щГич╜▓coolcoth.comшп┤цШО.md | 12 ++--- 网站审计与后台美化报告.md | 2 +- 酷冰甲CMS-过程总结与维护手册.md | 4 +- 13 files changed, 123 insertions(+), 28 deletions(-) diff --git a/PATCH-README.txt b/PATCH-README.txt index f2fe833..b5dbed1 100644 --- a/PATCH-README.txt +++ b/PATCH-README.txt @@ -2,7 +2,7 @@ ================================================== 本压缩包包含「数据库管理」与「数据库升级」两个后台模块的改动, -适用于部署在 st-joyapparel.com 的站点(需运行 MySQL)。 +适用于部署在 coolcoth.com 的站点(需运行 MySQL)。 一、包含文件 ------------ diff --git a/app/Core/App.php b/app/Core/App.php index d15f791..7fc56a5 100644 --- a/app/Core/App.php +++ b/app/Core/App.php @@ -17,6 +17,7 @@ class App // 1. 时区 & 会话 date_default_timezone_set(self::config('app.timezone', 'Asia/Shanghai')); if (session_status() !== PHP_SESSION_ACTIVE) { + self::ensureSessionPath(); session_start([ 'cookie_httponly' => true, 'cookie_samesite' => 'Lax', @@ -48,6 +49,43 @@ class App self::dispatch(self::parseRoute()); } + /** + * 确保 session 存储路径可用。 + * 服务器 session.save_path 可能指向不存在/不可写目录(如旧域名残留配置、 + * php_admin_value 锁定等),此时 session_start() 会报 Warning 并失败。 + * 本方法依次尝试:1) session_save_path() 切换到项目本地目录;2) 若被锁则 + * 注册自定义文件 session handler 完全绕过服务器配置。 + */ + private static function ensureSessionPath() + { + $sp = session_save_path(); + // session.save_path 可能带 N;/path 深度前缀,取实际路径部分判断 + $spDir = ($pos = strpos($sp, ';')) !== false ? substr($sp, $pos + 1) : $sp; + if ($spDir !== '' && is_dir($spDir) && is_writable($spDir)) { + return; // 服务器路径正常,无需处理 + } + + $localSession = BASE_PATH . '/storage/sessions'; + if (!is_dir($localSession)) { + @mkdir($localSession, 0755, true); + } + if (!is_dir($localSession) || !is_writable($localSession)) { + return; // 本地目录也建不了,交给 session_start() 原样报错 + } + + // 尝试 1:session_save_path() 切换(php_value 级别可生效) + session_save_path($localSession); + $checkPath = session_save_path(); + $checkDir = ($pos = strpos($checkPath, ';')) !== false ? substr($checkPath, $pos + 1) : $checkPath; + if ($checkDir === $localSession) { + return; // 切换成功 + } + + // 尝试 2:被 php_admin_value 锁定,注册自定义文件 handler 完全绕过 + $handler = new LocalSessionHandler($localSession); + session_set_save_handler($handler, true); + } + /** 解析请求路径为段数组 */ public static function parseRoute(): array { @@ -405,3 +443,59 @@ class App exit; } } + +/** + * 本地文件 session handler —— 当服务器 session.save_path 不可用/被锁时, + * 将 session 数据存到项目 storage/sessions/ 目录,完全绕过服务器配置。 + * 兼容 PHP 7.4 ~ 8.x(不声明返回类型,用 #[\ReturnTypeWillChange] 抑制 8.x 弃用提示)。 + */ +class LocalSessionHandler implements \SessionHandlerInterface +{ + private $dir; + + public function __construct(string $dir) + { + $this->dir = $dir; + } + + public function open($savePath, $sessionName) + { + return is_dir($this->dir) && is_writable($this->dir); + } + + public function close() + { + return true; + } + + #[\ReturnTypeWillChange] + public function read($id) + { + $f = $this->dir . '/sess_' . $id; + return is_file($f) ? (string) @file_get_contents($f) : ''; + } + + public function write($id, $data) + { + return @file_put_contents($this->dir . '/sess_' . $id, $data) !== false; + } + + public function destroy($id) + { + $f = $this->dir . '/sess_' . $id; + return is_file($f) ? @unlink($f) : true; + } + + #[\ReturnTypeWillChange] + public function gc($maxlifetime) + { + $n = 0; + foreach ((array) @glob($this->dir . '/sess_*') as $f) { + if (is_file($f) && filemtime($f) + $maxlifetime < time()) { + @unlink($f); + $n++; + } + } + return $n; + } +} diff --git a/app/Core/Theme.php b/app/Core/Theme.php index e4702b4..5bac358 100644 --- a/app/Core/Theme.php +++ b/app/Core/Theme.php @@ -18,7 +18,7 @@ class Theme 'site_slogan' => '科技降温 · 清凉一夏', 'site_logo' => '', 'contact_phone' => '400-1783-998', - 'contact_email' => 'service@st-joyapparel.com', + 'contact_email' => 'service@coolcoth.com', 'contact_address'=> '江苏省苏州市工业园区', 'icp' => '', 'seo_title' => '酷冰甲降温服 - 科技降温服装定制', diff --git a/bt-acme-fix.conf b/bt-acme-fix.conf index ed0efae..237f5b6 100644 --- a/bt-acme-fix.conf +++ b/bt-acme-fix.conf @@ -9,7 +9,7 @@ # 放在原有 location / { try_files ... } 之前 location ^~ /.well-known/acme-challenge/ { - root /www/wwwroot/st-joyapparel.com; # 改成你的项目真实根目录(不含 /public) + root /www/wwwroot/coolcoth.com; # 改成你的项目真实根目录(不含 /public) default_type text/plain; try_files $uri =404; } diff --git a/bt-nginx-rewrite.conf b/bt-nginx-rewrite.conf index d9a516e..059ad81 100644 --- a/bt-nginx-rewrite.conf +++ b/bt-nginx-rewrite.conf @@ -10,6 +10,6 @@ try_files $uri $uri/ /index.php?$query_string; # Let's Encrypt HTTP-01 验证路径(否则证书签发 404) location ^~ /.well-known/acme-challenge/ { - root /www/wwwroot/st-joyapparel.com; # 改成你的项目真实根目录(不含 /public) + root /www/wwwroot/coolcoth.com; # 改成你的项目真实根目录(不含 /public) default_type text/plain; } diff --git a/bt-ssl-dns.md b/bt-ssl-dns.md index 4b750e1..4a925dc 100644 --- a/bt-ssl-dns.md +++ b/bt-ssl-dns.md @@ -1,16 +1,16 @@ # 宝塔 Nginx + DNS 验证 申请 SSL 证书(详细操作顺序) -> 适用:已建好站点 `st-joyapparel.com`、运行目录=`/public`、已配前端控制器伪静态。 +> 适用:已建好站点 `coolcoth.com`、运行目录=`/public`、已配前端控制器伪静态。 > 用 DNS 验证可以**完全绕开** `.well-known/acme-challenge` 路径问题,最稳。 --- ## 一、前置确认(1 分钟) -1. 域名 `st-joyapparel.com` 已在宝塔「网站」里建好站点。 +1. 域名 `coolcoth.com` 已在宝塔「网站」里建好站点。 2. 域名解析里**至少有一条 A 记录**指向服务器 `47.107.30.116` (这样证书签发后 HTTPS 才能真正用起来;DNS 验证本身不要求域名解析到本机,但上线必须)。 -3. 宝塔 → 网站 → `st-joyapparel.com` → 设置 → 网站目录 → **运行目录 = `/public`**(已设过可跳过)。 +3. 宝塔 → 网站 → `coolcoth.com` → 设置 → 网站目录 → **运行目录 = `/public`**(已设过可跳过)。 4. 伪静态里**只保留**前端控制器那条(去掉之前为 HTTP 验证加的 `.well-known` location 也行,DNS 用不到它): ```nginx try_files $uri $uri/ /index.php?$query_string; @@ -29,9 +29,9 @@ - AccessKey Secret (在对应云服务商的「访问控制 / API 密钥」里创建,**只给 DNS 解析权限**即可,别给全量权限) 4. 保存。 -5. 回到 网站 → `st-joyapparel.com` → **SSL** → **Let's Encrypt**。 +5. 回到 网站 → `coolcoth.com` → **SSL** → **Let's Encrypt**。 6. 验证方式下拉选 **DNS验证**(或「DNS API」)。 -7. 勾选要签的域名(`st-joyapparel.com` 和 `www.st-joyapparel.com`)。 +7. 勾选要签的域名(`coolcoth.com` 和 `www.coolcoth.com`)。 8. 点 **申请**。宝塔会自动添加 TXT 记录 → 等待 CA 校验 → **自动签发并部署**。 9. 完成后页面显示「证书已部署」,结束。✅ @@ -43,11 +43,11 @@ > 没有 API 密钥时用这个。缺点:下次续签要再手动加一次 TXT(除非改用 API)。 -1. 网站 → `st-joyapparel.com` → **SSL** → **Let's Encrypt**。 +1. 网站 → `coolcoth.com` → **SSL** → **Let's Encrypt**。 2. 验证方式选 **DNS验证**。 3. 页面会列出**需要你手动添加的 DNS 记录**,一般是: - 记录类型:**TXT** - - 主机记录:**`_acme-challenge`**(完整即 `_acme-challenge.st-joyapparel.com`) + - 主机记录:**`_acme-challenge`**(完整即 `_acme-challenge.coolcoth.com`) - 记录值:一长串字符(如 `S7ASyftFIXsmMfhFqydT7QfMsFpsmTXRLD7FMZd_AIY` 之类,以页面显示为准) - (如果要给 `www` 也签,会再给一条 `_acme-challenge.www` 的 TXT) 4. **另开一个标签页**,登录你的域名解析控制台 @@ -55,9 +55,9 @@ 5. 添加上面那条 TXT 记录,保存。 6. **等解析生效**(看 TTL,通常 1–10 分钟;用下面命令自查): ```bash - nslookup -type=TXT _acme-challenge.st-joyapparel.com + nslookup -type=TXT _acme-challenge.coolcoth.com # 或 Windows: - nslookup -type=TXT _acme-challenge.st-joyapparel.com 8.8.8.8 + nslookup -type=TXT _acme-challenge.coolcoth.com 8.8.8.8 ``` 看到记录值和你填的一致,说明生效。 7. 回到宝塔,点 **验证 / 申请**。CA 读到 TXT 后即签发并自动部署。 @@ -68,12 +68,12 @@ 1. SSL 页确认证书状态为「已部署」,有效期约 90 天。 2. 开启 **强制 HTTPS**(SSL 页里有开关)→ 访问 `http://` 自动跳 `https://`。 -3. 浏览器访问 `https://st-joyapparel.com/` 和 `https://www.st-joyapparel.com/`,确认: +3. 浏览器访问 `https://coolcoth.com/` 和 `https://www.coolcoth.com/`,确认: - 地址栏出现小锁 🔒 - 前台页面、后台 `/admin` 都正常(之前配的 `try_files` 继续生效) 4. 跑部署收尾(若还没跑): ```bash - cd /www/wwwroot/st-joyapparel.com + cd /www/wwwroot/coolcoth.com bash deploy.sh rm -rf install # 删安装目录 ``` diff --git a/install/seed.php b/install/seed.php index 5390b6b..d92abdc 100644 --- a/install/seed.php +++ b/install/seed.php @@ -54,7 +54,7 @@ return [ ['skey'=>'site_name','sval'=>'酷冰甲 · 降温服','sgroup'=>'site'], ['skey'=>'site_slogan','sval'=>'科技降温 · 清凉一夏','sgroup'=>'site'], ['skey'=>'contact_phone','sval'=>'400-1783-998','sgroup'=>'site'], - ['skey'=>'contact_email','sval'=>'service@st-joyapparel.com','sgroup'=>'site'], + ['skey'=>'contact_email','sval'=>'service@coolcoth.com','sgroup'=>'site'], ['skey'=>'contact_address','sval'=>'江苏省苏州市工业园区','sgroup'=>'site'], ['skey'=>'icp','sval'=>'苏ICP备10206899号','sgroup'=>'site'], ['skey'=>'seo_title','sval'=>'酷冰甲降温服 - 科技降温服装定制','sgroup'=>'site'], diff --git a/public/.user.ini b/public/.user.ini index c6ba7aa..5717857 100644 --- a/public/.user.ini +++ b/public/.user.ini @@ -1,2 +1,2 @@ -session.save_path=/www/php_session/st-joyapparel.com/ -session.save_handler = files \ No newline at end of file +session.save_path=/www/php_session/coolcoth.com/ +session.save_handler = files diff --git a/robots.txt b/robots.txt index 6e9d5bb..5c0dff2 100644 --- a/robots.txt +++ b/robots.txt @@ -1,4 +1,4 @@ -# www.st-joyapparel.com robots.txt +# www.coolcoth.com robots.txt # 禁止爬虫抓取后台、系统、内部静态资源等敏感路径 User-agent: * diff --git a/storage/sessions/.gitkeep b/storage/sessions/.gitkeep index e69de29..8b13789 100644 --- a/storage/sessions/.gitkeep +++ b/storage/sessions/.gitkeep @@ -0,0 +1 @@ + diff --git a/щГич╜▓coolcoth.comшп┤цШО.md b/щГич╜▓coolcoth.comшп┤цШО.md index 8a3a38a..9e7733c 100644 --- a/щГич╜▓coolcoth.comшп┤цШО.md +++ b/щГич╜▓coolcoth.comшп┤цШО.md @@ -1,11 +1,11 @@ # 圣巧依官网 ── 切换 coolcoth.com(Apache → Nginx)部署说明 -> 适用:把原 `st-joyapparel.com` 站点迁移到新域名 `coolcoth.com`,并将 Web 服务由 Apache 切换为 Nginx(宝塔环境)。 -> 联系邮箱保持 `service@st-joyapparel.com`(同属圣巧依公司,未随域名变更)。 +> 适用:把原 `coolcoth.com` 站点迁移到新域名 `coolcoth.com`,并将 Web 服务由 Apache 切换为 Nginx(宝塔环境)。 +> 联系邮箱保持 `service@coolcoth.com`(同属圣巧依公司,未随域名变更)。 --- -## 一、本次改动清单(相对原 st-joyapparel.com 代码) +## 一、本次改动清单(相对原 coolcoth.com 代码) | 文件 | 改动内容 | 是否需上传替换 | |---|---|---| @@ -14,8 +14,8 @@ | `public/robots.txt` | Sitemap 地址改为 `https://coolcoth.com/sitemap.xml` | ✅ 替换 | | `robots.txt`(项目根) | 同上 | ✅ 替换 | | `public/user.ini` | 会话目录改为 `/www/php_session/coolcoth.com/` | ✅ 替换 | -| `app/Core/Theme.php` | 联系邮箱(保持 `service@st-joyapparel.com`,未改) | ❌ 无需替换 | -| `install/seed.php` | 联系邮箱(保持 `service@st-joyapparel.com`,未改) | ❌ 无需替换 | +| `app/Core/Theme.php` | 联系邮箱(保持 `service@coolcoth.com`,未改) | ❌ 无需替换 | +| `install/seed.php` | 联系邮箱(保持 `service@coolcoth.com`,未改) | ❌ 无需替换 | | `.htaccess` / `public/.htaccess` | Apache 规则,Nginx 下不生效,保留无害 | ❌ 无需替换 | > 因站点功能(路由、SEO、后台)基于请求域名自动生成 URL(`site_url()` / `absolute_url()`), @@ -68,4 +68,4 @@ ## 六、旧域名 -`st-joyapparel.com` 若不再使用,请在 DNS / 阿里云释放;其服务器目录可保留或清理。 +`coolcoth.com` 若不再使用,请在 DNS / 阿里云释放;其服务器目录可保留或清理。 diff --git a/网站审计与后台美化报告.md b/网站审计与后台美化报告.md index 941e311..0551274 100644 --- a/网站审计与后台美化报告.md +++ b/网站审计与后台美化报告.md @@ -1,7 +1,7 @@ # 圣巧依 / 酷冰甲 CMS — 完整性 · 安全性审计 & 后台美化报告 - 本地:`G:\www\phpEnv\www\圣巧依新的` -- 远端:https://st-joyapparel.com/ (后台 `admin`) +- 远端:https://coolcoth.com/ (后台 `admin`) - 技术栈:原生 PHP MVC(自研路由/View/Model),MySQL / 文件双驱动 - 说明:项目为 PHP 服务端渲染,与 Nuxt/Nuxt-UI 无关,本次未引入前端框架。 diff --git a/酷冰甲CMS-过程总结与维护手册.md b/酷冰甲CMS-过程总结与维护手册.md index b083c3b..d45a7aa 100644 --- a/酷冰甲CMS-过程总结与维护手册.md +++ b/酷冰甲CMS-过程总结与维护手册.md @@ -6,7 +6,7 @@ --- ## 一、项目定位与技术底座 -- **站点**:酷冰甲降温服企业官网,线上 `st-joyapparel.com`,后台 `/admin`。 +- **站点**:酷冰甲降温服企业官网,线上 `coolcoth.com`,后台 `/admin`。 - **架构**:原生 PHP 7.4 MVC(无 Composer/框架),前端 jQuery + 自研 `page-builder.js`,CSS 变量主题引擎。 - **存储**:双模式——默认文件 JSON(`storage/data/*`),可切 MySQL(`install/schema.sql`)。`Core\Model` 统一抽象。 - **能力**:产品/分类/新闻/客户案例/单页 5 类内容 + 订单/支付(支付宝/微信 demo+live)+ 三级权限(super_admin/admin/user)+ 可视化自由画布。 @@ -38,7 +38,7 @@ ### 阶段 E:打磨与 Bug 收口 14. **暗色主题自适应**:`canvas.php` 改用 CSS 变量,历史 `#0f172a` 归一 `var(--c-text)`;`page/show.php` 复用共享 canvas 去掉重复内联。 -15. **全站品牌更名**:`圣巧依`→`酷冰甲`、`service@sqy58.com`→`service@st-joyapparel.com`,19 文件替换 + grep 0 命中(保留 SQY 型号代号/英文 eyebrow/目录名/参考外链)。 +15. **全站品牌更名**:`圣巧依`→`酷冰甲`、`service@sqy58.com`→`service@coolcoth.com`,19 文件替换 + grep 0 命中(保留 SQY 型号代号/英文 eyebrow/目录名/参考外链)。 16. **案例/新闻编辑 404**:表单缺 slug 框 → update 按中文标题重建 slug。补 slug 框 + 隐藏 content 框。 17. **升级清数据根因**:`Installer::upgrade()` 曾 `DELETE` 清空客户数据。改为非破坏(按 id/skey 补齐);update slug 空则保留;前台 show 加数字 id 兜底。 18. **slug 顺序生成**:store 先插取 id → slug=id(自定义则 slugify),URL 短而稳定。