
đź§© Masalah
Saat menjalankan Laravel Octane (misalnya pakai Swoole) di balik Nginx reverse proxy di dalam Docker, kadang URL yang di-render di browser tidak sesuai port mapping Docker Compose. Contoh:
Akses localhost:8013 tapi resource (seperti gambar) muncul sebagai http://localhost/images/logo.svg (port-nya hilang).
âť— Padahal aplikasi bisa diakses, cuma navigasi atau asset jadi error/miss karena base URL salah.
🔍 Penyebab
Konfigurasi proxy_set_header Host $host; di Nginx tidak mengikutkan port. Laravel/Octane kemudian hanya mendeteksi hostname (tanpa port), sehingga saat url()->to() atau asset() digunakan, port hilang dari hasil render.
Lebih lanjut lagi:
Kalau di dalam file Nginx:
listen 80;
Maka Laravel akan anggap port request adalah 80 bukan port yang di-mapping oleh Docker (misal 8013:80), tapi langsung 80 (hilang karena default http).
âś… Solusi
âś… 1. Pastikan proxy_set_header Host mencantumkan port:
proxy_set_header Host $host:$server_port;
âś… 2. Samakan semua port:
- Port yang digunakan di
docker-compose.yml(port mapping) - Port di konfigurasi
nginx.conf(listen) - Port saat akses via browser
Contoh:
services:
nginx:
ports:
- "8013:8013"
server {
listen 8013;
...
proxy_pass <http://app:8000>;
proxy_set_header Host $host:$server_port;
}
Kalau salah satu beda, Laravel akan tetap gunakan port dari Nginx listen sebagai referensi, bukan dari mapping Docker.
⚡ Kesimpulan
Saat pakai Laravel Octane + Docker + Nginx:
- Gunakan
proxy_set_header Host $host:$server_port; - Samakan semua port antara
listen, Dockerports, dan URL akses - Jangan hanya andalkan
APP_URL, karena Laravel akan override berdasarkanHostdari header request


