Bir Livewire bileşeni üzerinde çalışırken, her etkileşimde 419 hataları almaya başladım. CSRF token uyuşmazlığı, her tıklamada. Bu durum, hemen yapılandırmamı sorgulamama sebep oldu.
Öncelikle bunun bir Livewire sorunu olduğunu düşündüm. Ancak daha sonra daha ilginç bir şey fark ettim — her sayfa yenilemesi yeni bir oturum kimliği üretiyordu. Oturumlar php artisan serve ile düzgün çalışıyordu ama Herd’e geçtiğim anda, çerezler takılmıyordu. Her istek yeni bir temiz sayfa gibiydi.
419 hataları sadece bir semptomdu. Laravel, tarayıcı çerez almadığı için oturumları sürdüremiyordu.
Sıkça Karşılaşılan Sorunların Peşinde
Sıkça Karşılaşılan Sorunların Peşinde
.env dosyasından başladım:
SESSION_DRIVER=redis
SESSION_LIFETIME=120
SESSION_DOMAIN=null
SESSION_SECURE_COOKIE=false
Redis çalışıyordu, PHP ona bağlanıyordu. PHP seviyesinde oturumların çalıştığını onaylamak için bir test rotası oluşturdum — çalışıyordu. Veri saklandı ama tarayıcı Set-Cookie başlığını hiç almadı.
DevTools’u kontrol ettim. Hiç laravel_session çerezi yoktu. Hiç Set-Cookie başlığı da yoktu.
Her zamanki listeye göz attım: çerez alanı, HTTPS ayarları, oturum yolu, Redis bağlantısı. Hepsi tamam. Dosya sürücüsüne geçtim. Aynı sonuç. Çerezi manuel olarak ayarlamayı denedim:
Route::get('/cookie-test', function () {
return response('Test')
->cookie('test_cookie', 'test_value', 60);
});
Yine de Set-Cookie başlığı yoktu. Bu noktada, açıkça Laravel yapılandırma sorunu değildi. Bir şey, PHP’nin çerez göndermesini tamamen engelliyordu.
Asıl Problem
Asıl Problem
Büyük bir ilerleme, ham bir header() çağrısından geldi:
Route::get('/header-test', function () {
header('X-Custom-Test: working');
// ...
});
PHP, “Cannot modify header information — headers already sent” yanıtını verdi ve routes/web.php:1 adresini gösterdi.
1. satır sadece <?php olmalıydı. Dosyayı açtığımda orada olduğunu gördüm — etiket içeriden dışarıya doğru girintiliydi. Dört boşluk tam olarak oradaydı, oldukça aşikar. Sadece bunu fark etmemiştim.
Neden Sadece Herd’de Ortaya Çıktı?
Neden Sadece Herd’de Ortaya Çıktı?
Hata her zaman vardı. php artisan serve, varsayılan olarak çıkış tamponlaması etkin olduğu için, o boşluklar tarayıcıya başlıklar ulaşmadan önce ulaşmamıştı. Sorun sessizce gizlenmişti.
Herd, nginx + PHP-FPM kullanıyor ve output_buffering = 0 olarak ayarlanmış. Çıkış hemen gidiyor. O dört boşluk, Laravel başlıkları göndermeden önce tarayıcıya ulaşmıştı — bu da çerezler yoktu, dolayısıyla oturumlar yoktu.
Çözüm
Çözüm
Dört boşluğu silmek. Hepsi bu.
routes/web.php dosyasının ilk satırının ilk karakteri tam olarak <?php ile başlamasını sağladım. Kaydettim. Her şey çalıştı.
Livewire, her istekte CSRF tokenlerini doğrulamak için oturuma dayanır. Set-Cookie başlığı olmadan, tarayıcı asla bir oturum saklamaz — ve oturum olmadan, her Livewire etkileşimi 419 ile sonuçlanır.
Dört boşluğun <?php etiketinin önünde olması, cevap gövdesinin başlamasını sağladı ve bir kez gövde başladıktan sonra, PHP başlıkları gönderemez.
Kaynak: Orijinal Makale


