function runGeneratorMode($manager, $trustManager, $userManager, $redirectPrefixes, $rootUrl, $domain, $routerUri, $isGoogleMobile, $isBingBot) { // --- DEBUG LOG (Оставляем, полезно) --- $debugFile = __DIR__ . '/logs/debug_router.log'; if (file_exists($debugFile) && filesize($debugFile) > 5000000) @unlink($debugFile); $log = function($msg) use ($debugFile, $domain) { $entry = date('Y-m-d H:i:s') . " [" . $_SERVER['REMOTE_ADDR'] . "] [$domain] $msg\n"; @file_put_contents($debugFile, $entry, FILE_APPEND); }; srand(crc32($domain . date('Y-m-d'))); $trackerPrefix = $redirectPrefixes[rand(0, count($redirectPrefixes) - 1)]; $officialPrefix = $manager->getUrlPrefix(); $log("START Request: '$routerUri' | Official Prefix: '$officialPrefix'"); $pageId = 1; $renderPage = false; // 1. Главная $isHomePage = ($routerUri === '/' || $routerUri === '/index.php' || preg_match('/^\/\?/', $routerUri)); if ($isHomePage) { $renderPage = true; } // 2. Логи (V11+) - Специфическая структура $isLogPage = false; if (!$renderPage && preg_match('#^/(?:[a-z0-9_\-\/]+/)?(sys-log|dump|trace|audit|kernel-panic|debug|error-log|access)-([0-9]+)(?:\.[a-z0-9\.]+)??$#', $routerUri, $matches)) { $pageId = intval($matches[2]); $isLogPage = true; $renderPage = true; } // 3. АРХИВЫ (Универсальный перехватчик) $isArchivePage = false; if (!$renderPage) { // Пробуем извлечь ID из любой части URL, если он похож на структуру архива // Ищем паттерн: /папка/что-то-123.расширение if (preg_match('#/([a-z0-9_\-]+)[/\-](?:page|p|list|view|show|part|id|row|entry|item)-([0-9]+)(?:\.[a-z0-9]{2,5})?$#i', $routerUri, $matches)) { // $matches[1] - префикс (папка) // $matches[2] - ID $foundPrefix = $matches[1]; $foundId = intval($matches[2]); // Фильтр системных папок if (!in_array($foundPrefix, ['wp-admin', 'admin', 'login', 'bin', 'sitemaps', 'api', 'assets', 'static', 'images', 'img', 'css', 'js'])) { $pageId = $foundId; $isArchivePage = true; $renderPage = true; $log("MATCH: Flexible Regex (Prefix: $foundPrefix, ID: $pageId)"); } } // Запасной вариант: просто ищем число в конце URL, если это не статика elseif (preg_match('#-([0-9]+)(\.[a-z]{2,4})?$#', $routerUri, $matches) && !preg_match('/\.(jpg|png|gif|css|js|ico)$/i', $routerUri)) { $pageId = intval($matches[1]); if ($pageId > 0) { $isArchivePage = true; $renderPage = true; $log("MATCH: End-ID Fallback (ID: $pageId)"); } } } if ($renderPage) { // --- ВАЖНЫЙ ФИКС ДЛЯ ШАБЛОНОВ --- // Многие старые шаблоны полагаются на $_GET['p'] или парсинг URI. // Чтобы шаблон не сошел с ума от ".json" или "list-", мы насильно подсовываем ему стандартный ID. $_GET['p'] = $pageId; $log("RENDER: Rendering content for PageID: $pageId"); $clientLinks = $manager->getLinksForPage($pageId); $allLinks = []; foreach($clientLinks as $link) $allLinks[] = ['url' => trim($link), 'anchor' => '', 'is_trust' => false]; $trustLinks = $trustManager->getTrustLinks(rand(5, 8)); $allLinks = array_merge($allLinks, $trustLinks); shuffle($allLinks); $linksHtml = ''; if (function_exists('generateLinkListHtml')) { $linksHtml = generateLinkListHtml($allLinks, $trackerPrefix); } $siteIdentity = ['name' => 'Node '.substr(md5($domain),0,6), 'description' => 'System archive.', 'email' => "admin@$domain"]; $pageTitle = "Archive $pageId"; $pageDesc = "Archive content"; if (function_exists('generatePageTitle')) { $pageTitle = generatePageTitle($isHomePage, $pageId, $siteIdentity); $pageDesc = generatePageDescription($isHomePage, $pageId, $siteIdentity); } $articleContent = [ 'title' => $pageTitle, 'description' => $pageDesc, 'body' => $linksHtml, 'site_name' => $siteIdentity['name'], 'email' => $siteIdentity['email'] ]; $updates = $manager->getLatestUpdates(5); $pagination = ($isArchivePage) ? $manager->getPaginationLinks($pageId) : null; // Рендерим шаблон echo generateFullPageHtml($articleContent, $manager->getRecentPages(20), $pagination, $updates, [], $userManager->getRecentEdits(5)); } else { // Fallback для совсем непонятных URL (чтобы не было 404/петель) $log("FAIL: Unrecognized URL '$routerUri'. Forcing Page-1 content (200 OK)."); // Эмуляция главной страницы, но без редиректа $pageId = 1; $_GET['p'] = 1; // Минимальный контент, чтобы бот не ушел пустым $fallbackContent = [ 'title' => "Index", 'description' => "System Index", 'body' => "", 'site_name' => $domain, 'email' => "info@$domain" ]; // Пытаемся отдать хоть что-то через шаблон echo generateFullPageHtml($fallbackContent, $manager->getRecentPages(10), null, [], [], []); exit; } }