- Konu sahibi
- #1
Laravel .htaccess yapılandırması
Laravel uygulamasında doğru yapılandırma, alan adının proje kökünü değil
public klasörünü göstermesi ve bu klasördeki .htaccess dosyasının mevcut dosya ve dizinler dışındaki istekleri index.php dosyasına yönlendirmesidir. Böylece /login, /users/15 gibi yollar Laravel yönlendiricisine ulaşır; public/css ve public/storage gibi gerçek dosyalar ise doğrudan sunulur.Ön koşullar ve dosya konumu
Apache üzerinde
mod_rewrite etkin olmalıdır. Ayrıca sunucu, ilgili dizindeki .htaccess yönergelerine izin vermelidir. AllowOverride ve AllowOverrideList birlikte gerekli yönergelere izin vermiyorsa kurallar okunmaz veya izin hatası oluşur.Önerilen dizin yapısı şöyledir:
Kod:
/var/www/example-app/
├── app/
├── bootstrap/
├── config/
├── public/
│ ├── .htaccess
│ ├── index.php
│ └── build/
├── resources/
└── storage/
Sanal konak veya Apache yapılandırmasında belge kökü
/var/www/example-app/public olmalıdır. Yetkili yönetici, gerçek dizin için sunucunun ana Apache yapılandırmasında gerekli izinleri tanımlamalıdır. Aşağıdaki örnek yol uyarlanmalıdır; bu blok .htaccess içine yazılmaz:
Kod:
<Directory "/var/www/example-app/public">
AllowOverride Options FileInfo
Require all granted
</Directory>
Paylaşımlı hosting kullanıyorsanız bu bölüm çoğunlukla hosting firması tarafından hazırlanır. Kuralları yazmadan önce sağlayıcınızın Apache ve
mod_rewrite desteğini doğrulayın.Laravel .htaccess dosyasının temel parçaları
Önce projenizin kullandığı Laravel dağıtımıyla gelen
public/.htaccess dosyasını koruyun. Aşağıdaki sadeleştirilmiş örnek, resmî iskeletteki temel akışı açıklar; sürümünüze veya uygulamanıza özgü kuralları körlemesine değiştirmek için verilmemiştir:
Kod:
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews -Indexes
</IfModule>
RewriteEngine On
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{HTTP:X-XSRF-TOKEN} .
RewriteRule .* - [E=HTTP_X_XSRF_TOKEN:%{HTTP:X-XSRF-TOKEN}]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
RewriteEngine On yeniden yazmayı etkinleştirir. !-d ve !-f koşulları, gerçek dizinlerin ve dosyaların Laravel'e gönderilmesini engeller. Son kural yalnızca bulunamayan yolları index.php dosyasına aktarır. Kimlik doğrulama ve XSRF başlıkları için kullanılan iki kural, bazı PHP çalışma biçimlerinde bu HTTP başlıklarının uygulamaya ulaşmasına yardımcı olur.Uygulama ve test adımları
- Alan adının belge kökünü proje içindeki
publicklasörüne ayarlayın; proje kökünü belge kökü yapmak.env,vendorveya diğer özel dosyaların yanlışlıkla sunulmasına yol açabilir. - Kullanılan Laravel sürümünün özgün
public/.htaccessdosyasını karşılaştırın; mevcut güvenlik ve uygulama kurallarını koruyarak gerekli düzeltmeyi yapın. Dosya adının yanlışlıkla.htaccess.txtolmadığını kontrol edin. - Önce
http://example.com/adresini, ardından uygulamadaki bir Laravel rotasını ve var olan bir statik dosyayı açın. - Ana sayfa ve Laravel rotası çalışıyor, statik dosya doğrudan yükleniyorsa temel yapılandırma doğrudur. Olmayan bir rota için Laravel'in kendi 404 yanıtını görmeniz de yeniden yazmanın çalıştığını gösterir.
- Kurallar etkisizse önce Apache hata günlüğünü, belge kökünü,
mod_rewritedurumunu veAllowOverridedeğerini kontrol edin.500 Internal Server Erroralıyorsanız özellikleOptions -MultiViews -Indexessatırının sunucuda izinli olup olmadığını inceleyin.
Sorunlara göre doğru karar
Aynı belirti farklı bir yapılandırma hatasından kaynaklanabilir. Kontrol sırasını aşağıdaki gibi kullanmak gereksiz değişiklikleri önler.
| Belirti | Muhtemel neden | Kontrol veya çözüm |
|---|---|---|
| Tüm rotalar 404 dönüyor | Yeniden yazma etkin değil veya .htaccess okunmuyor | mod_rewrite ve AllowOverride FileInfo değerlerini kontrol edin |
| Ana sayfa açılıyor, alt rotalar 404 oluyor | İstek index.php dosyasına yönlenmiyor | public/.htaccess konumunu ve RewriteRule satırını kontrol edin |
| CSS ve JavaScript yüklenmiyor | Belge kökü yanlış veya varlık yolları hatalı | Belge kökünün public olduğundan emin olun |
| 500 Internal Server Error | İzin verilmeyen Options veya hatalı sözdizimi | Apache hata günlüğünü okuyun; gerekirse Options satırını hosting desteğiyle uyumlu hale getirin |
Tablodaki belirtilerden özellikle “ana sayfa çalışıyor, alt rotalar çalışmıyor” durumu, çoğunlukla PHP veya Laravel kodundan önce Apache katmanındaki yeniden yazma ayarına işaret eder.
index.php dosyasını elle farklı bir klasöre taşımak yerine önce public belge kökünü düzeltin.Sık yapılan hatalar
- .htaccess dosyasını proje köküne koymak: Apache belge kökü
publicise kural dosyası da genelliklepublic/.htaccessaltında olmalıdır. - Gerçek dosya koşullarını kaldırmak:
!-fve!-dkoşulları silinirse resim, CSS veya JavaScript istekleri gereksiz yere Laravel'e gönderilebilir. - public klasörünü URL'ye eklemek: Uygulama
example.com/publicüzerinden çalışıyorsa kalıcı çözüm genellikle URL'ye klasör eklemek değil, Apache belge kökünüpublicyapmaktır. - Kuralları art arda çoğaltmak: Birden fazla RewriteRule bloğu yönlendirme döngüsü oluşturabilir. İstek yolunu ve mevcut kuralları inceleyerek döngüyü test ortamında daraltın; çalışan dosyayı topluca silmeyin.
Sık sorulan sorular
Nginx kullanıyorsam bu .htaccess dosyası çalışır mı?
Tek başına Nginx bu dosyayı okumaz; Nginx sunucu bloğu yapılandırılır. Nginx önde, Apache arkada ise Apache’ye ulaşan isteklerde
.htaccess uygulanabilir. Önce gerçek sunucu zincirini doğrulayın.Laravel'i alt klasörde çalıştırmak için RewriteBase eklemeli miyim?
Her kurulumda gerekmez. Önce belge kökünü doğrudan Laravel'in
public klasörüne ayarlayın. Uygulama zorunlu olarak bir alt URL altında çalışacaksa gerçek sunucu yolu, sanal konak ayarı ve asset URL'leri birlikte değerlendirilmelidir; yalnızca RewriteBase eklemek tek başına çözüm değildir.PHP dosyası indiriliyorsa sorun .htaccess'te midir?
Bu bir PHP işleyicisi sorunu veya yanlış sunum yapılandırması olabilir. Kaynak kodunun indirilmesi hassas bilgi açığa çıkarabileceğinden yayını sınırlandırıp hosting yöneticisine başvurun; yalnız rewrite kuralı ekleyerek çözmeye çalışmayın.