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() 为