Troubleshooting E-rapor Tidak Bisa Diakses Melalui Internet
Agustus 06, 2026Catatan 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.
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.
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
- 1Cek framework: CI3 (folder
application/) atau CI4 (folderapp/)? - 2Temukan file penghitung base URL:
config.php(CI3) atauApp.php/Constants.php(CI4). - 3Terapkan patch
X-Forwarded-Protosesuai versi framework. - 4Kalau CI4 di server Windows, sertakan juga normalisasi backslash.
- 5Set
cookie_secure = FALSEdan pastikanCI_ENVIRONMENTbalik keproduction. - 6Test login/submit form lewat domain tunnel, bukan cuma localhost.
- 7Kalau masih error, cek DevTools Network tab (CI3) atau nyalakan mode development (CI4) untuk lihat pesan error asli.
Ringkasan Konsep
| Masalah | Penyebab | Solusi |
|---|---|---|
| Login diam, tanpa notifikasi (CI3) | base_url jadi http://, browser blok mixed content | Deteksi X-Forwarded-Proto |
| HTTP 500 "baseURL tidak valid" (CI4) | dirname() hasilkan backslash di server Windows | Normalisasi separator ke forward slash |
| Session/cookie tidak tersimpan | cookie_secure = TRUE tapi koneksi dianggap HTTP | Set cookie_secure = FALSE |