Ana içeriğe geç

htaccess Zorunlu mu? Olmadan Site Çalışır mı?

htaccess Zorunlu mu? - Apache Yapılandırma Rehberi

Hayır, zorunlu değil. Ama bu cevabın gerçek karşılığı kurulumunuza göre değişir — ve bazı durumlarda "zorunlu değil" ile "olmadan çalışmaz" arasındaki fark tek bir araç bağımlılığına dayanır.

Apache, .htaccess dosyası olmadan sorunsuz çalışır. Sunucu yapılandırma kurallarının tamamı httpd.conf dosyasından veya VirtualHost bloğundan uygulanabilir. .htaccess bir kolaylık katmanıdır; sitenizin ayakta durması için zorunlu bir bileşen değildir.

Apache .htaccess dosyasını nasıl değerlendirir?

Apache her HTTP isteğini işlerken, ilgili dizinden kök dizine kadar tüm klasörlerde .htaccess dosyası arar — AllowOverride yönergesi buna izin veriyorsa. Bu dosyaları bulduğunda içlerindeki kuralları o istek için uygular. Yani derin bir dizin yapısında tek bir sayfa isteği birden fazla .htaccess dosyasının okunmasına neden olabilir.

AllowOverride None olarak ayarlandığında ise Apache bu aramayı tamamen atlar. .htaccess dosyanız dizinde dursa bile okunmaz, işlenmez. Site çalışmaya devam eder — çünkü yapılandırma zaten ana config dosyasında tanımlıdır.

Yani .htaccess bir "ek yapılandırma kanalı"dır. Var olması gerekmiyor; yalnızca o kanalı kullanmak isteyenler için var. Bu ayrımı görmek, "zorunlu mu?" sorusunu doğru yere yerleştirmenizi sağlar: soru sunucuya değil, kurulumunuza aittir.

AllowOverride yönergesinin All ve None arasında ara seçenekleri de var: AuthConfig, FileInfo, Indexes, Limit, Options. Shared hosting sağlayıcılarının büyük çoğunluğu AllowOverride'ı tam açmaz — belirli bir alt kümeye izin verir. Bu durumla karşılaşıldığında .htaccess dosyasına yazdığınız bir direktif hiç hata vermeden sessizce yoksayılır; kural çalışmıyorsa neden çalışmadığı belirsiz kalır. FileInfo izni kapalıyken RewriteRule satırları işlenmez — sunucu ne bir hata döner ne de log'a yazar. Bu granülariteden habersiz olmak sorun gidermeyi öngörülemez bir hale getirir; özellikle paylaşımlı hostingte .htaccess'inizin neden "tutmadığını" anlamak zaman kaybettirir.

Neden bu kadar yaygın?

Shared hosting ortamlarında httpd.conf dosyasına dokunulamaz. O dosya hosting firmasına ait, tüm müşterilerin ortak sunucusunda yönetilir. .htaccess bu ortamda müşteriye "kendi alanında" yapılandırma yapma yetkisi verir. Hosting sağlayıcısı AllowOverride'ı açık bırakır, siz de bu pencereden kural koyarsınız.

Bir de değişiklik hızı var. VPS'e bağlanıp httpd.conf'u düzenlemiş, ardından Apache'yi yeniden başlatmak yerine tek bir dosyayı FTP ile atarsınız — değişiklik anında yürürlüğe girer, servis kesintisi olmaz. Sık değişen yönlendirme kuralları veya geliştirme ortamı testleri için bu akıcılık tercih sebebidir.

WordPress başta olmak üzere büyük CMS platformları da bu alışkanlığı pekiştirdi. WordPress permalink yapısı doğrudan .htaccess'e bağımlıdır. Kurulum sırasında otomatik oluşturulur; pek çok geliştirici .htaccess'i bu ortamda "olmadan olmaz" bir bileşen olarak öğrenir. Oysa bu bağımlılık Apache'nin değil, CMS'in bir tercihidir.

XAMPP ve WAMP gibi yerel geliştirme ortamları da bu algıyı şekillendirdi. Her ikisi de Apache tabanlıdır ve AllowOverride'ı varsayılan olarak açık bırakır. Lokal geliştirme ortamında .htaccess kuralları sorunsuz çalışır; geliştiricinin aklında "bu dosyayla her şeyi yapabilirsiniz" imajı oluşur. Sonra üretim ortamına geçildiğinde — eğer sunucu farklı yapılandırılmışsa ya da Nginx kullanılıyorsa — aynı dosya hiçbir şey yapmaz. Geliştirici deneyiminin üretim gerçekliğiyle uyuşmaması, bu mekanizmanın gereğinden güçlü bir mitos haline gelmesinin teknik sebebidir.

.htaccess olmadan neleri kaybedersiniz?

Sunucu erişiminiz varsa: hiçbir şey. Mod_rewrite kuralları, GZIP sıkıştırma, cache-control direktifleri, özel hata sayfaları, IP kısıtlamaları — bunların hepsi VirtualHost bloğuna yazılabilir ve birebir aynı şekilde çalışır.

Üstelik daha hızlı çalışır. Apache, AllowOverride None ile yapılandırıldığında her istek için dosya sistemi üzerinde .htaccess aramak zorunda kalmaz. Küçük bir sitede bu fark ihmal edilebilir; yüksek trafikli ortamlarda ölçülebilir hale gelir. Disk I/O'nun kritik olduğu sunucularda bu arama maliyeti gereksiz bir yüktür. 1000 eşzamanlı isteğin her biri birden fazla dizin seviyesinde .htaccess araması yaparsa bu toplam küçük bir rakam değildir.

Aynı kural kümesi, iki farklı yerde yazılabilir. Örneğin GZIP sıkıştırmayı etkinleştirmek için .htaccess'e şunu yazarsınız:

AddOutputFilterByType DEFLATE text/html text/css application/javascript

httpd.conf veya VirtualHost bloğuna da birebir aynı satırı koyabilirsiniz. Fark yalnızca nerede yazdığınızda ve Apache'nin bunu ne zaman okuduğundadır. Yanıt boyutunu azaltmak için sunucu katmanında sıkıştırma uygulamak, CSS ve JS dosyalarını küçültmek ile birlikte çalışır — ikisi farklı katmanlarda aynı amaca hizmet eder.

Gerçekten zorunlu olduğu durumlar

Shared hosting kullanıyorsanız alternatif yoktur. httpd.conf'a erişiminiz olmadığında .htaccess tek yolunuzdur. Yönlendirme kuralı, önbellekleme politikası, bot engelleme — hepsini buraya yazarsınız.

WordPress, Joomla veya Drupal kurulumlarında da durum benzer. WordPress'in varsayılan .htaccess içeriği şöyle görünür:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Bu blok olmadan tüm içerik sayfaları 404 döner. CMS bunu kurulum sırasında otomatik yazar, ama dosya silinirse veya bozulursa URL yapısı çöker. .htaccess bu anlamda Apache'nin zorunlu kıldığı bir şey değil; CMS'in bağımlı olduğu bir mekanizma.

React, Vue veya Angular gibi single-page application dağıtımlarında benzer bir durum var. Tüm rotaların index.html'e yönlendirilmesi gerekir; bu kural tanımlanmadığında alt sayfalara doğrudan erişim 404 verir. Alternatif olarak bu kural VirtualHost bloğuna da eklenebilir, ama shared hosting ortamında bu seçenek sunulmuyor.

Nginx ve diğer web sunucularında tablo farklı işler. .htaccess yalnızca Apache'ye özgü bir mekanizmadır; Nginx bu dosyaları okumaz, işlemez. Shared hosting'ten VPS'e geçip sunucuyu Nginx olarak yapılandıranlar — ki bu giderek yaygınlaşan bir tercih — .htaccess dosyalarının tamamının işlevsiz kaldığını fark eder. WordPress bu geçişte özellikle sorun yaratır: permalink kurallarının Nginx eşdeğeri, try_files direktifiyle server {} bloğuna elle yazılır. Aynı görünen ama tamamen farklı yapılandırılması gereken iki sunucu arasında zaman kaybeden ekiplerin büyük kısmı bu farkı geçişte atlamıştır. LiteSpeed ve OpenLiteSpeed bu konuda istisnadır; .htaccess'i destekler ve Apache yapılandırmasıyla büyük ölçüde uyumludur. Sunucu değiştirirken hangi .htaccess direktiflerinin olduğu gibi aktarılacağını, hangilerinin sunucuya özgü karşılıklarla yeniden yazılması gerekeceğini önceden belirlemek, beklenmedik 404 ve 500 hatalarının önüne geçer.

Karar noktaları

Hangi yaklaşımı seçeceğinizi belirleyen birkaç değişken var:

Durum Öneri Neden
Shared hosting .htaccess zorunlu httpd.conf'a erişim yok
VPS + WordPress / CMS .htaccess CMS bu dosyayı bekliyor
VPS + özel uygulama VirtualHost tercih edilir Daha hızlı, daha kontrollü
Yüksek trafik, performans kritik AllowOverride None + httpd.conf Her istekte dosya araması olmaz

VirtualHost tercihinin pratik bir dezavantajı var: her değişiklikten sonra Apache'yi yeniden başlatmanız gerekir. Servis birkaç saniyeliğine kesintiye uğrar, üretim ortamında dikkat ister. .htaccess'te yaptığınız değişiklikler anında etkili olur; bu esneklik bazı durumlarda performans maliyetini haklı kılar.

.htaccess'in gerçekten okunup okunmadığını doğrulamanın doğrudan bir yolu yok. apachectl -t komutu httpd.conf'taki sözdizim hatalarını yakalar, ama .htaccess dosyalarını taramaz — bu onların en büyük kör noktasıdır. Pratik test yöntemi: dosyaya kasıtlı olarak geçersiz bir satır yazın (InvalidDirective gibi), sayfayı yenileyin ve 500 dönüp dönmediğine bakın. 500 dönüyorsa dosya okunuyor demektir; sayfa normal yükleniyorsa AllowOverride devre dışı bırakmış veya dosya yanlış dizinde. Kural doğrulama için daha temiz bir yol: test amaçlı bir yönlendirme kuralı yazıp beklenmedik bir URL'ye yönlendirin, ardından response'un Location başlığını kontrol edin. Dosya çalışıyorsa yönlendirme gelir; gelmiyorsa sorun AllowOverride'da ya da dosya konumundadır.

Bir de sözdizimi riski var. .htaccess dosyasındaki tek bir yazım hatası, ilgili dizin altındaki tüm sayfalara 500 Internal Server Error döndürebilir. httpd.conf'ta hata yapılırsa Apache başlamaz — bu daha az tehlikeli bir hata modu çünkü başlatma sırasında fark edilir. .htaccess hatası ise dağıtımdan sonra fark edilir, canlı ortamda. Birden fazla .htaccess dosyasının iç içe dizinlerde üst üste bindiği yapılarda hatanın kaynağını bulmak daha da güçleşir; Apache error.log'u hangi dosyanın soruna yol açtığını her zaman açıkça belirtmez. Bu yüzden htaccess kurallarını oluştururken geçerli sözdiziminden başlamak önemlidir; el yazımı .htaccess dosyaları bu riski artırır.

.htaccess olmayan bir site hem çalışır hem de doğru yapılandırıldığında daha hızlı çalışır. Ama bu tercihin önünüzde olması, sunucu erişiminizin olmasına bağlıdır. Erişim varsa VirtualHost tercih edilir; yoksa .htaccess, kısıtlı ortamda tek yapılandırma kanalı olmaya devam eder. Her türlü yapılandırma değişikliklerinden sonra sitenizin genel durumunu hız ve erişilebilirlik analizi yaparak doğrulamak, beklenmeyen yapılandırma sonuçlarını erkenden yakalamanın en pratik yoludur.