Properti req.protocol dalam kerangka kerja Express.js digunakan untuk mengembalikan string protokol permintaan yang masuk, yaitu 'http' atau 'https'. Properti ini sangat penting ketika aplikasi Node.js Anda berada di belakang penyeimbang beban (load balancer) atau reverse proxy seperti Nginx, HAProxy, atau Cloudflare, di mana konfigurasi header HTTP tambahan diperlukan agar deteksi protokol tidak salah membaca koneksi internal.
Secara default, nilai properti ini ditentukan oleh koneksi socket TCP langsung ke server Node.js. Namun, jika aplikasi Anda mengaktifkan pengaturan 'trust proxy', Express akan membaca header X-Forwarded-Proto yang dikirimkan oleh proxy eksternal untuk menentukan apakah klien menggunakan enkripsi SSL/TLS atau koneksi HTTP standar.
Sintaks dan Contoh Penggunaan Dasar
Penggunaan properti ini sangat sederhana dan biasanya dipanggil di dalam fungsi pengendali rute (route handler) untuk keperluan pengalihan URL (redirect), pembuatan tautan absolut, atau pengaturan cookie yang aman.
const express = require('express');
const app = express();
app.get('/', (req, res) => {
// Mendapatkan protokol yang digunakan klien
const currentProtocol = req.protocol;
// Mendapatkan nama host dari header Host
const host = req.get('host');
res.send(`Aplikasi Anda diakses menggunakan protokol: ${currentProtocol} dengan host ${host}`);
});
app.listen(3000);
Peran Penting Pengaturan 'trust proxy'
Ketika aplikasi Express.js berjalan di lingkungan produksi (production), aplikasi hampir selalu berada di belakang reverse proxy. Jika Anda tidak mengaktifkan app.set('trust proxy', true), req.protocol akan selalu mengembalikan 'http' meskipun pengguna mengakses situs Anda menggunakan https://.
| Konfigurasi Express | Kondisi Proxy | Hasil req.protocol | Keterangan Teknis |
|---|---|---|---|
| Tanpa Trust Proxy | Di belakang Nginx/Cloudflare | http |
Membaca langsung dari socket TCP lokal antara proxy dan Node.js. |
app.set('trust proxy', true) |
Di belakang Nginx/Cloudflare | https |
Membaca nilai dari header X-Forwarded-Proto yang diteruskan proxy. |
| Menggunakan IP Tertentu | Proxy tepercaya | https |
Hanya mempercayai header dari alamat IP proxy yang ditentukan secara spesifik. |
Penerapan Nyata untuk Pengalihan HTTPS Otomatis
Salah satu penggunaan paling umum dari properti ini adalah memaksa pengguna agar beralih dari koneksi HTTP yang tidak aman ke HTTPS secara otomatis di sisi server.
app.use((req, res, next) => {
// Aktifkan app.set('trust proxy', true) terlebih dahulu
if (req.protocol !== 'https' && process.env.NODE_ENV === 'production') {
return res.redirect(`https://${req.headers.host}${req.url}`);
}
next();
});
Troubleshooting Masalah req.protocol
Jika nilai yang dihasilkan tidak sesuai harapan, periksa beberapa hal berikut di infrastruktur Anda:
- Header Hilang: Pastikan reverse proxy (seperti Nginx) dikonfigurasi untuk meneruskan header
proxy_set_header X-Forwarded-Proto $scheme;ke aplikasi Node.js. - Multi-Proxy: Jika menggunakan beberapa lapis proxy, nilai
trust proxyharus disesuaikan dengan jumlah hop atau rentang IP proxy yang valid agar Express tidak membaca alamat IP yang salah. - Environment: Pastikan pengujian lokal dan produksi dibedakan karena lingkungan lokal umumnya tidak menggunakan SSL/TLS kecuali dikonfigurasi secara manual dengan sertifikat self-signed.