AI-generated görseller 403 Forbidden hatası veriyor
Ne Oldu?
Müzik platformunda şarkı kapak görselleri AI ile başarıyla oluşturuldu (20/20 başarı!). Ancak sitede görseller görünmüyor - browser 403 Forbidden (Erişim Engellendi) hatası alıyor.
Neden Oldu?
Web sunucusu (LiteSpeed) çok katı güvenlik modunda (phpSuExec=2) çalışıyor. Bu mod, "kısayol" (symlink) olan dosyalara erişimi engelliyor. Görseller storage klasöründe, ancak web'den erişim için kısayol kullanıyoruz.
Ne Denendi?
Şu Anda Durum:
❌ Görseller mevcut ama erişilemiyor
❌ LiteSpeed phpSuExec=2 modu symlink'leri engelliyor
❌ Global config değişiklikleri işe yaramıyor
Neden Önemli?
Kullanıcılar şarkı kapak görsellerini göremiyorlar. Site görsel olarak eksik görünüyor. AI ile üretilen 20 görselin hiçbiri erişilebilir değil.
public/storage/tenant1001 → storage/tenant1001/app/public⚠️ Bu hata user/group eşleşmesine rağmen oluşuyor! LiteSpeed phpSuExec=2 modunda ek kontroller var.
LiteSpeed phpSuExec=2 Mode: Hardcoded Symlink Restriction
phpSuExec=2 modu, PHP execution için değil, static file serving için de symlink kontrolü yapıyor. Bu kontrol LiteSpeed core seviyesinde ve config dosyalarıyla devre dışı bırakılamıyor.
Nginx sunucularında disable_symlinks off ile çözülen bu sorun,
LiteSpeed'de böyle bir directive olmadığı için çözülemiyor.
/usr/local/lsws/conf/httpd_config.xml dosyasında <phpSuExec>2</phpSuExec> → <phpSuExec>1</phpSuExec>
routes/tenant.php içinde /storage/tenant{id}/{path} route'u oluştur,
Storage::download() ile dosyayı PHP üzerinden serve et.
storage/tenant{id}/app/public/ → public/storage/tenant{id}/ (hard copy, symlink değil)
Görselleri AWS S3, Cloudflare R2, veya DigitalOcean Spaces gibi cloud storage'a yükle, Media Library'yi cloud'a yönlendir.
Plesk'te Apache + LiteSpeed yerine Nginx + PHP-FPM kullan. Nginx'te disable_symlinks off; çalışıyor.
📊 Durum
💡 Önerilen Aksiyon
Seçenek A: phpSuExec Değişikliği (ÖNERİLEN)
phpSuExec=2 → phpSuExec=1 değiştir. Bu GLOBAL değişiklik olduğu için
önce LiteSpeed WebAdmin'den vhost-specific ayar mümkün mü kontrol et.
Seçenek B: Laravel Route Serving (HIZLI)
routes/tenant.php içinde route oluştur, X-Sendfile ile serve et.
Symlink gerektirmez, hızlı implement edilir.
Seçenek C: Cloud Storage (UZUN VADELI)
AWS S3/Cloudflare R2 entegrasyonu. Symlink sorununu tamamen çözer, CDN avantajı sağlar.
📝 Karar Noktası
Kullanıcıya sunulacak 3 seçenek var. Her birinin artı/eksileri açık. Seçenek A (phpSuExec değişikliği) en kolay ve performanslı ama global etki var. Seçenek B (Laravel route) hızlı implement ama performans kaybı var. Seçenek C (cloud) uzun vadeli en iyi çözüm ama maliyet/zaman gerektirir.