0, // 会话 Cookie 'path' => $cookieParams['path'] ?: '/', 'domain' => $cookieParams['domain'] ?: '', 'secure' => $cookieParams['secure'], 'httponly' => true, 'samesite' => 'Lax', ] ); } // ===== Session 诊断日志(仅首次请求记录,避免日志泛滥) ===== if (empty($_SESSION['_diag_logged'])) { $_SESSION['_diag_logged'] = 1; $diagPath = ini_get('session.save_path'); $diagWritable = is_writable($diagPath) ? 'writable' : 'NOT_WRITABLE'; $diagSameSite = ini_get('session.cookie_samesite'); $diagSecure = ini_get('session.cookie_secure'); $diagHttpOnly = ini_get('session.cookie_httponly'); $sessHash = session_id() ? hash('sha256', session_id()) : 'none'; error_log("[SESSION_DIAG] path={$diagPath} {$diagWritable} samesite={$diagSameSite} secure={$diagSecure} httponly={$diagHttpOnly} session_hash={$sessHash}"); } define('APP_PATH', __DIR__ . '/'); // 基础URL路径(自动检测子目录,无需手动配置) // 例如:部署在 /mes/ 下则自动为 /mes,部署在根目录则为空 $scriptDir = dirname($_SERVER['SCRIPT_NAME']); define('BASE_URL', ($scriptDir === '/' || $scriptDir === '\\') ? '' : $scriptDir); // 从 .env 读取调试模式开关(生产环境设为 false) $envDebug = getenv('APP_DEBUG'); if ($envDebug === false || $envDebug === '') { // 环境变量未设置时,从 .env 文件读取 $envFile = __DIR__ . '/.env'; if (file_exists($envFile)) { $lines = file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); foreach ($lines as $line) { $line = trim($line); if ($line === '' || $line[0] === '#') continue; if (strpos($line, '=') !== false) { list($k, $v) = explode('=', $line, 2); if (trim($k) === 'APP_DEBUG') { $envDebug = trim($v); break; } } } } } define('APP_DEBUG', ($envDebug === 'true' || $envDebug === '1')); // 启用输出缓冲,防止 PHP 错误/警告污染 JSON/HTML 输出 ob_start(); // 加载全局辅助函数(必须在框架和视图之前加载) require(APP_PATH . 'core/helper.php'); // 加载框架文件 require(APP_PATH . 'core/Core.php'); // 加载配置文件 $config = require(APP_PATH . 'config/config.php'); // ===== v3-P2 CSP:基于 nonce 的内容安全策略(严格模式) ===== // 每次请求生成独立 nonce 并注入 CSP 头;视图通过 csp_nonce() 为