getTargetPath(); // Access via getter $now = date('Y-m-d H:i:s'); // Helper functions function extract_between($text, $start, $end) { $pattern = "/$start(.*?)$end/s"; if (preg_match($pattern, $text, $matches)) { return trim($matches[1]); } return ''; } function replace_between($text, $start, $end, $replacement) { $pattern = "/($start)(.*?)(\s*$end)/s"; return preg_replace($pattern, "$1\n$replacement\n$3", $text); } // Fetch redirects $query = "SELECT redirects.mode, redirects.link, redirects.onlink, redirects.offlink, domains.name FROM redirects JOIN domains ON domains.id = redirects.did ORDER BY redirects.id"; $result = $db_handler->runQuery($query); $response = []; if (!$result || count($result) === 0) { $response[] = "[$now] No redirects found in the database."; } else { foreach ($result as $row) { $domain = trim($row['name']); $mode = trim($row['mode']); $link = trim($row['link'], '/'); // Corrected: Set redirectLink based on mode if ($mode == "on") { $redirectLink = trim($row['onlink']); } else { $redirectLink = trim($row['offlink']); } $rule = "RewriteRule ^$link\$ $redirectLink [R=302,L]"; $htaccessPath = $targetPath . $domain . '/.htaccess'; if (!file_exists($htaccessPath)) { $response[] = "[$now] .htaccess not found for $domain"; continue; } $htaccess = file_get_contents($htaccessPath); $needleStart = '#start_custom_redirects'; $needleEnd = '#end_custom_redirects'; if (str_contains($htaccess, $needleStart) && str_contains($htaccess, $needleEnd)) { $between = extract_between($htaccess, $needleStart, $needleEnd); if (strpos($between, $rule) === false) { $newRules = trim($between) . PHP_EOL . $rule; $updated = replace_between($htaccess, $needleStart, $needleEnd, $newRules); file_put_contents($htaccessPath, $updated); $response[] = "[$now] Added to $domain/.htaccess → /$link => $redirectLink"; } else { $response[] = "[$now] Already exists in $domain → /$link"; } } else { $response[] = "[$now] Missing markers in $domain/.htaccess"; } } } // Output as JSON echo json_encode($response, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); ?>