' . '
' . '

还差一步:没有找到 config.php

' . '

' . '请复制同目录下的 config.example.php 为 config.php,' . '填好数据库连接与 app_key 后再访问。

' . '
'; exit; } $GLOBALS['config'] = require $configFile; // ---------------- 错误报告(线上不显示错误,避免泄露路径与库信息)---------------- $debug = !empty($GLOBALS['config']['debug']); error_reporting(E_ALL); ini_set('display_errors', $debug ? '1' : '0'); ini_set('log_errors', '1'); /** * 把错误日志指到**我们够得着的地方**(v24)。 * * 为什么需要:线上出 500 时最该看的就是错误日志,而宝塔的 `/www/wwwlogs` * 既不在部署账号的读权限内,也不在 `open_basedir` 允许的路径里 * (本站是 `/www/wwwroot/…:/tmp/`)。这一轮真遇到了:用户报 500, * 能查的全查了(逐文件哈希、两账号 32 次真实渲染、边界输入、DNS/证书/缓存) * 全绿,唯独拿不到"当时哪一行炸了"。 * * 做法:**只需指定 `error_log`** —— PHP 本来就会把 Fatal error(含文件:行号与 * 调用栈)写进去,不需要自己注册 shutdown 钩子。 * (实测:先前那版加了 `register_shutdown_function` 反而多余, * 钩子自身一旦出错还会**再抛一个 Fatal**,把真正的原因埋掉。) * * 落点:优先站点根的 `db/`(敏感配置所在地,不入 Web 根、不进仓库), * 没有就回落 `sys_get_temp_dir()`(线上 open_basedir 含 `/tmp/`,一定可写)。 * 两处都不可写就保持原样(记日志不该把站点拖垮)。 * * ⚠️ 只记 PHP 自己的错误文本,**不记**请求体/变量值(可能含口令)。 */ { $fbLogFile = ''; foreach ([__DIR__ . '/../db', sys_get_temp_dir()] as $fbDir) { if (is_dir($fbDir) && is_writable($fbDir)) { $fbLogFile = rtrim($fbDir, '/\\') . '/familybook-error.log'; break; } } if ($fbLogFile !== '') { ini_set('log_errors', '1'); ini_set('error_log', $fbLogFile); } } // ---------------- 时区:日期是家书的核心数据,一开始就必须明确 ---------------- date_default_timezone_set($GLOBALS['config']['timezone'] ?? 'Asia/Shanghai'); // ---------------- 安全响应头 ---------------- // Referrer-Policy: 跨域取图不带 Referer —— 这一条能兜住云存储防盗链 // 导致的「图片不显示、但地址栏直接打开没问题」那类怪异现象。 if (!headers_sent()) { header('Referrer-Policy: same-origin'); header('X-Content-Type-Options: nosniff'); } // ---------------- 会话 ---------------- $isHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || (($_SERVER['HTTP_X_FORWARDED_PROTO'] ?? '') === 'https'); session_name('fbsid'); session_set_cookie_params([ 'lifetime' => 0, 'path' => '/', 'secure' => $isHttps, 'httponly' => true, 'samesite' => 'Lax', ]); if (session_status() !== PHP_SESSION_ACTIVE) { session_start(); } require FB_APP . '/helpers.php';