logFile = __DIR__ . '/proxy.log'; } /** Simple logger */ private function logMessage($message) { $date = date('Y-m-d H:i:s'); file_put_contents($this->logFile, "[$date] $message\n", FILE_APPEND); } /** Build the target URL based on incoming request */ private function buildTargetUrl() { $path = isset($_GET['path']) ? $_GET['path'] : ''; unset($_GET['path']); $query = http_build_query($_GET); $apiUrl = "https://llar.joyworkdev.ru/api/" . ltrim($path, '/'); if ($query) { $apiUrl .= '?' . $query; } return $apiUrl; } /** Build headers for the forwarded request */ private function buildHeaders() { $headers = array( 'Accept: application/json', ); // Preserve original Content-Type if present $originalContentType = isset($_SERVER['CONTENT_TYPE']) ? $_SERVER['CONTENT_TYPE'] : ''; if ($originalContentType) { $headers[] = 'Content-Type: ' . $originalContentType; $this->logMessage("Incoming Content-Type: '$originalContentType'"); } else { $this->logMessage('WARNING: Incoming Content-Type not detected'); } // Pass session cookie if exists if (!empty($_COOKIE['PHPSESSID'])) { $headers[] = 'Cookie: PHPSESSID=' . $_COOKIE['PHPSESSID']; } // Pass custom header from Vue if present if (!empty($_SERVER['HTTP_X_SESSION_ID'])) { $headers[] = 'X-Session-ID: ' . $_SERVER['HTTP_X_SESSION_ID']; } return $headers; } /** Forward the request using cURL and output the response */ private function forwardRequest($targetUrl, $headers, $method, $body) { $ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_URL => $targetUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => $method, CURLOPT_POSTFIELDS => $body, CURLOPT_HTTPHEADER => $headers, CURLOPT_HEADER => false, )); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curlError = curl_error($ch); if ($curlError) { $this->logMessage('cURL Error: ' . $curlError); } curl_close($ch); http_response_code($httpCode); echo $response; } /** Main handler – called from index.php */ public function handle() { // CORS headers – must be sent before any output header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Credentials: true'); header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS'); header('Access-Control-Allow-Headers: Accept, Content-Type, X-Requested-With, Authorization'); if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; } $targetUrl = $this->buildTargetUrl(); $headers = $this->buildHeaders(); $method = $_SERVER['REQUEST_METHOD']; $body = file_get_contents('php://input'); $this->logMessage('Forwarding request to ' . $targetUrl); $this->forwardRequest($targetUrl, $headers, $method, $body); } } ?>