Troubleshooting E-rapor Tidak Bisa Diakses Melalui Internet

Catatan Teknis · Server Sekolah

CodeIgniter di balik Cloudflare Tunnel

Panduan cepat untuk aplikasi e-rapor dan sistem sekolah lainnya yang diakses lewat Cloudflare Tunnel — kenapa login/HTTP 500 sering muncul, dan cara memperbaikinya secara permanen di setiap instalasi ulang.

Akar masalahnya selalu satu: Cloudflare Tunnel melakukan TLS termination di edge Cloudflare, lalu meneruskan trafik ke server origin lewat HTTP biasa. Aplikasi Anda tidak pernah melihat $_SERVER['HTTPS'] = 'on', walau user mengaksesnya lewat https://. Ini merusak semua kode yang menghitung base_url secara otomatis.

Solusinya selalu sama: percayai header X-Forwarded-Proto yang otomatis dikirim oleh cloudflared untuk memberi tahu aplikasi bahwa koneksi aslinya HTTPS.

A. CodeIgniter 3

Gejala: halaman login tampil normal, tapi setelah submit form tidak ada respons sama sekali — tidak redirect, tidak ada notifikasi error.

CI3 application/config/config.php

Tambahkan kode ini tepat sebelum baris $config['base_url'] dihitung:

// Cloudflare Tunnel melakukan TLS termination di edge, sehingga koneksi ke
// origin server ini sebenarnya HTTP meski user mengakses via HTTPS.
if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

@$config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http");
@$config['base_url'] .= "://" . $_SERVER['HTTP_HOST'];
@$config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']), "", $_SERVER['SCRIPT_NAME']);

Cek tambahan: cookie_secure sebaiknya FALSE kecuali Anda yakin semua akses selalu HTTPS end-to-end.

B. CodeIgniter 4

Gejala: aplikasi menghasilkan HTTP 500 saat diakses lewat domain tunnel, padahal normal saat diakses lokal.

Langkah wajib sebelum patch apapun: ubah CI_ENVIRONMENT = development di .env untuk melihat stack trace error asli, atau cek writable/logs/log-*.php. Jangan lupa kembalikan ke production setelah selesai.
CI4 app/Config/Constants.php

Kalau app/Config/App.php memakai konstanta custom (public string $baseURL = BASE;), konstanta BASE biasanya dihitung di Constants.php. Ganti perhitungannya dengan versi berikut — ini juga memperbaiki bug khas server Windows di mana dirname() bisa mengembalikan backslash yang membuat URL tidak valid:

// Percayai header X-Forwarded-Proto dari cloudflared.
if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']) === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

$scriptDir = dirname($_SERVER['SCRIPT_NAME'] ?? '/index.php');
// Di server Windows (IIS/XAMPP), dirname() bisa mengembalikan backslash (\)
// sehingga BASE jadi URL tidak valid (mis. "https://domain\").
$scriptDir = str_replace('\\\\', '/', $scriptDir);
if ($scriptDir === '' || $scriptDir === '.') {
    $scriptDir = '/';
}
if (substr($scriptDir, -1) !== '/') {
    $scriptDir .= '/';
}

$base = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off'
    ? 'https://'.$_SERVER['HTTP_HOST'].$scriptDir
    : 'http://'.$_SERVER['HTTP_HOST'].$scriptDir;
defined('BASE') || define('BASE', $base);

Kalau App.php pakai format default (public string $baseURL = 'http://localhost:8080/';), cukup isi .env:

app.baseURL = 'https://domain-tunnel-anda/'

Checklist Cepat Saat Install Ulang

  1. 1Cek framework: CI3 (folder application/) atau CI4 (folder app/)?
  2. 2Temukan file penghitung base URL: config.php (CI3) atau App.php / Constants.php (CI4).
  3. 3Terapkan patch X-Forwarded-Proto sesuai versi framework.
  4. 4Kalau CI4 di server Windows, sertakan juga normalisasi backslash.
  5. 5Set cookie_secure = FALSE dan pastikan CI_ENVIRONMENT balik ke production.
  6. 6Test login/submit form lewat domain tunnel, bukan cuma localhost.
  7. 7Kalau masih error, cek DevTools Network tab (CI3) atau nyalakan mode development (CI4) untuk lihat pesan error asli.

Ringkasan Konsep

MasalahPenyebabSolusi
Login diam, tanpa notifikasi (CI3)base_url jadi http://, browser blok mixed contentDeteksi X-Forwarded-Proto
HTTP 500 "baseURL tidak valid" (CI4)dirname() hasilkan backslash di server WindowsNormalisasi separator ke forward slash
Session/cookie tidak tersimpancookie_secure = TRUE tapi koneksi dianggap HTTPSet cookie_secure = FALSE

Komentar