- Konu sahibi
- #1
Apache AllowOverride ile .htaccess ilişkisi
Apache’de
AllowOverride, bir dizin için .htaccess dosyasında hangi yapılandırma direktiflerinin kullanılabileceğini belirler. AllowOverride None ve AllowOverrideList None birlikteyse .htaccess okunmaz; AllowOverride All ise izin verilen tüm override grupları açılır. Bu nedenle .htaccess içindeki bir kural çalışmıyorsa ilk kontrol edilmesi gereken yer, ilgili dizinin Apache yapılandırmasındaki AllowOverride ayarıdır.Nasıl çalışır?
Apache, eşlenen dosya yolunun üst dizinlerindeki geçerli dağıtık yapılandırmaları değerlendirebilir; kapsamı yalnız belge kökünden başlıyor sanmayın. Dosyanın bulunduğu dizin için .htaccess kullanımına izin verilmişse içindeki direktifleri okur. Ancak her direktif otomatik olarak geçerli değildir; direktifin bağlı olduğu override sınıfı açık olmalıdır.
Örneğin URL yeniden yazma kuralları genellikle
FileInfo sınıfına, kimlik doğrulama direktifleri ise AuthConfig sınıfına bağlıdır. AllowOverride All sorunu hızlıca gizleyebilir; fakat hangi özelliğin gerektiğini belirleyip yalnızca ilgili sınıfı açmak daha kontrollü bir yaklaşımdır.Somut örnek: URL yeniden yazmayı etkinleştirme
Varsayalım ki site dosyaları
/var/www/example altında ve bu dizinde aşağıdaki .htaccess dosyası bulunuyor:
Kod:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^eski$ /yeni [R=302,L]
</IfModule>
Bu kuralın çalışabilmesi için ilgili Apache yapılandırmasında örneğin şu bölüm bulunmalıdır:
Kod:
<Directory "/var/www/example">
AllowOverride FileInfo
</Directory>
Bu parça, mevcut doğru dizin bölümündeki override ayarını gösterir; erişim denetimi kurallarınızı değiştirmez.
FileInfo rewrite direktiflerine izin verir. Ayrıca mod_rewrite yüklü olmalı ve dizin kapsamında FollowSymLinks veya SymLinksIfOwnerMatch uygun biçimde etkin olmalıdır. Sunucu yapılandırmasına yönetici erişimi gerekir. Yapılandırmayı değiştirdikten sonra Apache yapılandırmasını doğrulayın ve başarılıysa yeniden yükleyin:
Kod:
apachectl configtest
apachectl graceful
Başarılı doğrulamada beklenen temel çıktı
Syntax OK ifadesidir. Doğrulama hata verirse Apache yeni yapılandırmayı yüklememiş olabilir; hata mesajındaki dosya ve satırı düzeltmeden yeniden yükleme yapmayın. Ana yapılandırma testi, her istekte okunacak .htaccess içeriğini bütün durumlarıyla sınamaz. Örnek kök dizinde /eski isteği için 302 ve /yeni konumunu bekleyin; ilgisiz bir yolun yönlenmediğini de kontrol edin. Yapılandırma doğru olduğu hâlde kural çalışmıyorsa mod_rewrite modülünün yüklü olup olmadığını, .htaccess dosyasının doğru dizinde bulunduğunu ve dosya adının tam olarak .htaccess olduğunu kontrol edin.Aşağıdaki tablo, yaygın ihtiyaç ile ilgili ayar arasındaki kararı özetler:
| İhtiyaç | Gerekli sınıf | Kontrol edilecek nokta |
|---|---|---|
| URL yeniden yazma | FileInfo | RewriteEngine ve RewriteRule |
| Parola doğrulama | AuthConfig | Kimlik doğrulama modülleri ve kullanıcı dosyası |
| Dizin listelemeyi Options ile açıp kapatma | Options | Options -Indexes için verilen sınıfı kontrol edin |
| Hiçbir .htaccess kuralına izin vermeme | AllowOverride None + AllowOverrideList None | Kuralların ana Apache yapılandırmasına taşınması |
Uygulanabilir karar ve sık hatalar
- Önce .htaccess içinde kullanılan direktifleri belirleyin. Örneğin yalnızca
RewriteRulekullanılıyorsa gereksiz yereAllaçmayın. - Direktiflerin geçerli olduğu dizini kapsayan
<Directory>bölümünü bulun.AllowOverridebaşka bir dizin için değiştirilmişse doğru dosya yolunu kapsamayabilir. - İhtiyaca uygun sınıfı, örneğin
AllowOverride FileInfoveyaAllowOverride AuthConfigolarak ayarlayın. Birden fazla sınıf gerekiyorsa aralarında boşluk kullanın. - Apache yapılandırmasını
apachectl configtestile doğrulayın; hata varsa önce bunu düzeltin. - Apache’yi yeniden yükleyip isteği tekrar deneyin.
500 Internal Server Erroralırsanız hata günlüğünü inceleyin; çoğunlukla izin verilmeyen veya yazımı hatalı bir direktif bulunur.
Indexes sınıfı DirectoryIndex ve IndexOptions gibi direktifleri kapsar; Options -Indexes için gereken sınıf Options’tır. AllowOverrideList ile tek tek izin verilmiş direktifler varsa None tek başına dosyayı kapatmaz. Diğer bir hata da AllowOverride All verildiğinde her direktifin çalışacağını sanmaktır; modül eksikliği, yanlış dizin kapsamı veya direktifin farklı bir override sınıfına ait olması yine sorun çıkarabilir. Sunucu yapılandırmasına erişiminiz varsa kuralları doğrudan ana Apache yapılandırmasına taşımak genellikle daha açık ve daha kolay denetlenebilir; .htaccess ise ana yapılandırmaya erişilemeyen barındırma ortamlarında pratik bir seçenektir.Sık sorulan sorular
AllowOverride satırı .htaccess içine yazılır mı?
Hayır. Ana Apache yapılandırmasındaki, düzenli ifade kullanmayan
<Directory> bölümünde geçerlidir. .htaccess veya Location içine eklemek doğru değildir; paylaşımlı hostingde sağlayıcının ilgili ayarı yönetmesi gerekebilir.AllowOverride All kullanmak sorunu kesin olarak çözer mi?
Hayır. Yanlış dizin kapsamı, eksik modül, sözdizimi hatası veya başka bir Apache kuralı sorunun devam etmesine neden olabilir. Ayrıca yalnız gereken sınıfı açmak, gereksiz direktifleri sınırlamak açısından daha uygundur.