diff --git a/cloakjs.php b/cloakjs.php index d045d79..561e9cd 100755 --- a/cloakjs.php +++ b/cloakjs.php @@ -134,6 +134,7 @@ if ($__cloak_risk_enhanced) { _0x5aa8d7.set('ip', 'v_ip, ENT_QUOTES, 'UTF-8') : ''; ?>'); _0x5aa8d7.set('ciso', 'v_country, ENT_QUOTES, 'UTF-8') : ''; ?>'); _0x5aa8d7.set('log_id', ''); + _0x5aa8d7.set('config_name', ''); _0x5aa8d7.set('isEmulator', false); _0x5aa8d7.set('referer', document.referrer); _0x5aa8d7.set('risk_enhanced', __cloakRiskEnhanced); diff --git a/config/ConfigLoader.php b/config/ConfigLoader.php index 7416519..ae89a6d 100755 --- a/config/ConfigLoader.php +++ b/config/ConfigLoader.php @@ -41,7 +41,9 @@ class ConfigLoader } /** - * 同域多落地页:入口脚本有独立配置时优先脚本名;否则按 HTTP Host(多站/宝塔);再回退脚本名或 index + * 同域多落地页:入口脚本有独立配置时优先脚本名; + * 伪静态/rewrite 落到 index.php 时从 REQUEST_URI 路径解析配置名; + * 否则按 HTTP Host(多站/宝塔);再回退脚本名或 index * * @return string 实际加载的配置名 */ @@ -50,13 +52,15 @@ class ConfigLoader $host = $host ?? ($_SERVER['HTTP_HOST'] ?? ''); $baseDir = dirname(__DIR__); $scriptSanitized = self::sanitizeConfigName((string) $scriptBaseName); - $scriptConfigFile = $baseDir . '/check_config/' . $scriptSanitized . '_config.php'; - $scriptConfigExists = $scriptSanitized !== 'index' - && $scriptSanitized !== 'ip_check' - && file_exists($scriptConfigFile); - if ($scriptConfigExists) { + if (self::hasConfigFile($scriptSanitized, $baseDir)) { return self::loadByName($scriptSanitized); } + + $uriConfigName = self::resolveConfigNameFromRequestUri($baseDir); + if ($uriConfigName !== null) { + return self::loadByName($uriConfigName); + } + if ($host !== '') { return self::loadByHost($host); } @@ -66,6 +70,108 @@ class ConfigLoader return self::loadByName('index'); } + /** + * 从 URL 或路径解析落地页配置名(不含 query)。 + * + * @return string|null + */ + public static function resolveConfigNameFromUrl($url, $baseDir = null) + { + if ($url === '') { + return null; + } + $path = parse_url($url, PHP_URL_PATH); + if (!is_string($path)) { + return null; + } + return self::resolveConfigNameFromPath($path, $baseDir); + } + + /** + * 从 REQUEST_URI 路径段解析落地页配置名(不含 query)。 + * 用于 nginx try_files → index.php 等场景:/PH-fwa037?utm=... 仍应对应 PH-fwa037 配置。 + * + * @return string|null 可加载的配置名;无法解析时 null + */ + public static function resolveConfigNameFromRequestUri($baseDir = null) + { + $uri = (string) ($_SERVER['REQUEST_URI'] ?? ''); + if ($uri === '') { + return null; + } + $path = parse_url($uri, PHP_URL_PATH); + if (!is_string($path)) { + return null; + } + return self::resolveConfigNameFromPath($path, $baseDir); + } + + /** + * @return string|null + */ + public static function resolveConfigNameFromPath($path, $baseDir = null) + { + $baseDir = $baseDir ?: dirname(__DIR__); + $path = (string) $path; + if ($path === '' || $path === '/') { + return null; + } + + $basename = basename($path); + $name = self::sanitizeConfigName($basename); + if ($name === 'index' || $name === 'ip_check' || $name === 'f_check') { + return null; + } + if (!self::hasConfigFile($name, $baseDir)) { + return null; + } + return $name; + } + + /** + * 二次风控 f_check / byApiRisk:优先 hdata.config_name,其次落地页 URL 路径,再 Host 映射。 + * + * @param string $pageUrl hdata.domain(浏览器当前页完整 URL) + * @param string|null $fallbackHost 兜底 Host(通常为 HTTP_HOST) + * @param string|null $explicitConfigName hdata.config_name(ip_check 阶段已解析的配置名) + * @return string 实际加载的配置名 + */ + public static function loadForFingerprint($pageUrl, $fallbackHost = null, $explicitConfigName = null) + { + $baseDir = dirname(__DIR__); + + if ($explicitConfigName !== null && trim((string) $explicitConfigName) !== '') { + $explicit = self::sanitizeConfigName($explicitConfigName); + if (self::hasConfigFile($explicit, $baseDir)) { + return self::loadByName($explicit, $baseDir); + } + } + + $fromUrl = self::resolveConfigNameFromUrl((string) $pageUrl, $baseDir); + if ($fromUrl !== null) { + return self::loadByName($fromUrl, $baseDir); + } + + $host = $fallbackHost ?? ($_SERVER['HTTP_HOST'] ?? ''); + if ($host !== '') { + return self::loadByHost($host, $baseDir); + } + + return self::loadByName('index', $baseDir); + } + + /** + * @param string $configName + */ + private static function hasConfigFile($configName, $baseDir) + { + $configName = self::sanitizeConfigName($configName); + if ($configName === 'index' || $configName === 'ip_check') { + return false; + } + return file_exists($baseDir . '/check_config/' . $configName . '_config.php'); + } + public static function sanitizeConfigName($name) { $name = trim((string) $name); diff --git a/jump.txt b/jump.txt index 28ed6ca..ad0f91f 100755 --- a/jump.txt +++ b/jump.txt @@ -130,3 +130,4 @@ 2026-06-20 10:45:40 | 写入数据库 | false | indBXSXX | async=1 2026-06-20 10:46:58 | 写入数据库 | false | indBXSXX | async=1 2026-06-20 10:47:37 | 写入数据库 | false | indBXSXX | async=1 +2026-06-22 19:15:55 | 写入数据库 | false | index | async=1 diff --git a/lib/Cloak/FCheckHandler.php b/lib/Cloak/FCheckHandler.php index 4c27cc3..55f5681 100755 --- a/lib/Cloak/FCheckHandler.php +++ b/lib/Cloak/FCheckHandler.php @@ -48,7 +48,12 @@ class FCheckHandler if (!class_exists('ConfigLoader', false)) { require_once dirname(__DIR__, 2) . '/config/ConfigLoader.php'; } - $config_name = ConfigLoader::loadByHost($fp_host); + $explicitConfig = trim((string) ($fingerprint_info['config_name'] ?? '')); + $config_name = ConfigLoader::loadForFingerprint( + (string) ($fingerprint_info['domain'] ?? ''), + $fp_host, + $explicitConfig !== '' ? $explicitConfig : null + ); $log_id = (int) ($fingerprint_info['log_id'] ?? 0); if ($log_id <= 0) { $log_id = VisitorVisitContext::currentLogId(); @@ -191,9 +196,10 @@ class FCheckHandler RiskSecondaryCache::applyToSession($cached); $response = RiskSecondaryCache::toApiResponse($cached); + $resultStr = $response['result'] ? 'true' : 'false'; $update_log = [ - 'result' => $response['result'] ? 'true' : 'false', - 'reason' => cloak_cache_hit_log_reason($update_log['result']), + 'result' => $resultStr, + 'reason' => cloak_cache_hit_log_reason($resultStr), 'fp_url' => trim((string) ($response['link'] ?? '')), ]; if ($update_log['fp_url'] === '') { diff --git a/lib/Cloak/FpRiskExplain.php b/lib/Cloak/FpRiskExplain.php index abdaad5..15d5dc3 100755 --- a/lib/Cloak/FpRiskExplain.php +++ b/lib/Cloak/FpRiskExplain.php @@ -154,7 +154,14 @@ class FpRiskExplain if (!class_exists('DomainRepository', false)) { require_once __DIR__ . '/DomainRepository.php'; } - $configName = DomainRepository::resolveConfigNameForHost((string) $host, $baseDir); + if (!class_exists('ConfigLoader', false)) { + require_once dirname(__DIR__, 2) . '/config/ConfigLoader.php'; + } + + $configName = ConfigLoader::resolveConfigNameFromUrl((string) $domain, $baseDir); + if ($configName === null) { + $configName = DomainRepository::resolveConfigNameForHost((string) $host, $baseDir); + } $file = $baseDir . '/check_config/' . $configName . '_config.php'; if (!is_file($file)) { $configName = 'index'; diff --git a/lib/Cloak/Page/FpPageRenderer.php b/lib/Cloak/Page/FpPageRenderer.php index d5df445..394bbce 100755 --- a/lib/Cloak/Page/FpPageRenderer.php +++ b/lib/Cloak/Page/FpPageRenderer.php @@ -1,5 +1,6 @@ $logs, - 'v_info' => $v_info, - 'log_id' => $log_id, + 'logs' => $logs, + 'v_info' => $v_info, + 'log_id' => $log_id, + 'config_name' => $config_name, ]; if (CLOAK_REDIRECT_METHOD == 'curl') { self::renderRiskCurlInject($riskCtx); diff --git a/tools/verify_config_loader.php b/tools/verify_config_loader.php index f6f37db..7c2fb4e 100755 --- a/tools/verify_config_loader.php +++ b/tools/verify_config_loader.php @@ -22,6 +22,37 @@ $tests['script_priority_over_host'] = ($loadedScript === $key); $loadedIndex = ConfigLoader::loadForRequest('index', 'unknown-host-no-mapping.test'); $tests['index_uses_host_fallback'] = ($loadedIndex === 'index'); +$uriKey = 'reg_uri_' . substr(md5((string) microtime(true)), 0, 6); +$uriCfgFile = $root . '/check_config/' . $uriKey . '_config.php'; +file_put_contents($uriCfgFile, "