Penyebab utama terjadinya infinite redirect loop (pengalihan tak terbatas) saat menggunakan Nginx sebagai reverse proxy dari HTTP ke HTTPS adalah karena aplikasi di backend (seperti Node.js, Apache, atau PHP-FPM) mendeteksi bahwa permintaan yang masuk berasal dari koneksi HTTP (bukan HTTPS). Aplikasi kemudian mencoba memaksa pengalihan (redirect) ke HTTPS, yang kembali diterima oleh Nginx sebagai HTTP, sehingga siklus pengalihan terjadi terus-menerus tanpa henti.
Untuk mengatasi masalah ini, Anda wajib meneruskan header protokol yang benar dari Nginx ke server backend menggunakan arahan proxy_set_header X-Forwarded-Proto $scheme; dan memastikan blok server Nginx membedakan dengan jelas antara port 80 (HTTP) dan port 443 (HTTPS).
Langkah Konfigurasi Perbaikan Nginx
Berikut adalah konfigurasi blok server Nginx yang benar untuk mencegah terjadinya redirect loop pada layanan reverse proxy:
server {
listen 80;
server_name contoh.com www.contoh.com;
# Redirect semua traffic HTTP ke HTTPS secara aman di level Nginx
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name contoh.com www.contoh.com;
ssl_certificate /path/ke/sertifikat/fullchain.pem;
ssl_certificate_key /path/ke/sertifikat/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
# Header penting untuk mencegah loop
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Matriks Analisis Penyebab dan Solusi
| Penyebab Umum | Gejala di Browser | Solusi Teknis |
|---|---|---|
| Backend mendeteksi HTTP padahal diakses via HTTPS | ERR_TOO_MANY_REDIRECTS | Tambahkan proxy_set_header X-Forwarded-Proto $scheme; |
| Cloudflare Flexible SSL dengan Nginx HTTP | ERR_TOO_MANY_REDIRECTS | Ubah mode SSL Cloudflare menjadi Full atau Full (Strict) |
| Konfigurasi framework (Laravel/Express) tidak percaya proxy | Redirect berulang pada halaman login | Atur TRUSTED_PROXIES di sisi aplikasi backend |
Penyesuaian di Sisi Aplikasi Backend
Selain mengonfigurasi Nginx, pastikan aplikasi backend Anda membaca header X-Forwarded-Proto untuk menentukan apakah request asli menggunakan HTTPS. Sebagai contoh, pada framework Express.js (Node.js), Anda harus mengaktifkan pengaturan trust proxy:
app.set('trust proxy', true);Sedangkan pada framework Laravel (PHP), sesuaikan berkas app/Http/Middleware/TrustProxies.php agar mempercayai semua proxy atau IP dari Nginx lokal:
protected $proxies = '*';Troubleshooting Lapangan
Jika loop masih terjadi setelah menerapkan konfigurasi di atas, lakukan pemeriksaan berikut: 1) Bersihkan cache browser atau uji menggunakan mode incognito untuk memastikan tidak ada pengalihan yang tersimpan di cache. 2) Periksa log error Nginx (biasanya di /var/log/nginx/error.log) untuk melihat pola request yang masuk. 3) Pastikan tidak ada aturan tambahan di file .htaccess atau konfigurasi internal aplikasi yang memicu redirect mandiri.