track.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. <?php
  2. /**
  3. * Click tracking capture endpoint.
  4. * Logs request details to data/tracks.jsonl and redirects to the main page.
  5. * Usage: track.php (no parameters required)
  6. */
  7. $dataDir = __DIR__ . '/data';
  8. $logFile = $dataDir . '/tracks.jsonl';
  9. $mainPageUrl = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http')
  10. . '://' . ($_SERVER['HTTP_HOST'] ?? 'localhost')
  11. . rtrim(dirname($_SERVER['SCRIPT_NAME'] ?? '/'), '/') . '/index.php';
  12. $ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '';
  13. $forwarded = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : '';
  14. $realIp = isset($_SERVER['HTTP_X_REAL_IP']) ? $_SERVER['HTTP_X_REAL_IP'] : '';
  15. $key = isset($_GET['key']) && $_GET['key'] !== '' ? trim($_GET['key']) : null;
  16. if ($key === 'KEY') {
  17. header('Location: ' . $mainPageUrl);
  18. exit;
  19. }
  20. $payload = [
  21. 'timestamp' => date('c'),
  22. 'key' => $key,
  23. 'target_url' => null,
  24. 'ip' => $ip,
  25. 'ip_forwarded' => $forwarded !== '' ? $forwarded : null,
  26. 'ip_real' => $realIp !== '' ? $realIp : null,
  27. 'user_agent' => isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : null,
  28. 'referrer' => isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] !== '' ? $_SERVER['HTTP_REFERER'] : null,
  29. 'request_uri' => isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : null,
  30. 'request_method' => isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : null,
  31. 'query_string' => isset($_SERVER['QUERY_STRING']) ? $_SERVER['QUERY_STRING'] : null,
  32. 'accept_language' => isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : null,
  33. 'accept' => isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : null,
  34. ];
  35. if (!is_dir($dataDir)) {
  36. mkdir($dataDir, 0755, true);
  37. }
  38. $line = json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . "\n";
  39. file_put_contents($logFile, $line, FILE_APPEND | LOCK_EX);
  40. header('Location: ' . $mainPageUrl);
  41. exit;