.htaccess Dosyası Nasıl Kullanılır? Kapsamlı Bir Rehber
Giriş
Web sunucuları dünyasında, özellikle Apache kullanan ortamlar için .htaccess dosyası, web yöneticileri ve geliştiriciler için vazgeçilmez bir araçtır. Bu küçük, gizli dosya, sunucu ayarlarını dizin bazında değiştirmeye olanak tanıyarak, bir web sitesinin davranışını, güvenliğini ve performansını önemli ölçüde etkileyebilir. Temel yönlendirmelerden karmaşık URL yeniden yazma işlemlerine, güvenlik önlemlerinden performans optimizasyonlarına kadar geniş bir yelpazede görevleri yerine getirebilen .htaccess, doğru kullanıldığında web sitenize büyük esneklik ve kontrol sağlar. Ancak yanlış veya dikkatsiz kullanıldığında, web sitenizin tamamen erişilemez hale gelmesine neden olabilecek “500 Internal Server Error” gibi ciddi sorunlara yol açabilir. Bu kapsamlı rehberde, .htaccess dosyasının ne olduğunu, nasıl çalıştığını, yaygın kullanım alanlarını örneklerle birlikte ve kullanırken dikkat edilmesi gereken önemli noktaları detaylı bir şekilde inceleyeceğiz.
.htaccess Temelleri
.htaccess dosyası, Apache HTTP Sunucusu tarafından kullanılan dağıtılmış bir yapılandırma dosyasıdır. “Hypertext Access” kelimelerinin kısaltmasıdır ve genellikle sunucu genelinde yapılandırma dosyalarına (httpd.conf) erişimi olmayan kullanıcıların, kendi web dizinleri için belirli ayarları yapmasına olanak tanır.
.htaccess Nedir?
.htaccess, Apache web sunucusunun bir özelliğidir ve belirli bir dizin için yapılandırma ayarlarını geçersiz kılmak veya genişletmek için kullanılır. Bu dosyalar, Apache’nin ana yapılandırma dosyası olan httpd.conf’a erişimi olmayan paylaşımlı barındırma ortamlarında özellikle kullanışlıdır. Bir .htaccess dosyası, bulunduğu dizin ve alt dizinleri için geçerli olan kurallar içerir. Bu kurallar, PHP ayarlarından URL yeniden yazmaya, erişim kısıtlamalarından hata sayfalarına kadar çeşitli sunucu davranışlarını kontrol edebilir.
Nasıl Çalışır?
Apache sunucusu, bir web isteği aldığında, istenen kaynağın bulunduğu dizine ve o dizinin üst dizinlerine bakar. Her dizinde bir .htaccess dosyası bulursa, bu dosyaları okur ve içerdiği yönergeleri uygular. Bu işlem, en üst dizinden (genellikle public_html veya www) başlayarak istenen kaynağın bulunduğu dizine kadar devam eder. Kurallar, üst dizinlerden alt dizinlere doğru miras alınır ve alt dizinlerdeki kurallar, üst dizinlerdeki aynı kuralları geçersiz kılabilir.
.htaccess dosyalarının çalışabilmesi için Apache ana yapılandırmasında AllowOverride yönergesinin doğru şekilde ayarlanmış olması gerekir. AllowOverride None olarak ayarlanırsa, .htaccess dosyaları tamamen yok sayılır. AllowOverride All ise tüm yönerge türlerinin .htaccess dosyalarında kullanılmasına izin verir. Güvenlik ve performans nedenleriyle, barındırma sağlayıcıları genellikle AllowOverride değerini belirli yönerge türleriyle kısıtlar (örneğin, AllowOverride FileInfo AuthConfig Indexes).
Oluşturma ve Düzenleme
.htaccess dosyası, basit bir düz metin dosyasıdır. Herhangi bir metin düzenleyici (Notepad, Sublime Text, VS Code vb.) kullanılarak oluşturulabilir veya düzenlenebilir. Dosya adının başında bir nokta (.) olması, Unix tabanlı sistemlerde (Linux gibi) dosyanın gizli olduğu anlamına gelir. Bu nedenle, FTP istemcileri veya dosya yöneticileri aracılığıyla sunucuya erişirken gizli dosyaları gösterme seçeneğini etkinleştirmeniz gerekebilir.
Dosyayı oluşturduktan veya düzenledikten sonra, FTP, SFTP veya cPanel gibi bir kontrol panelinin dosya yöneticisi aracılığıyla web sitenizin kök dizinine veya belirli bir alt dizinine yüklemeniz gerekir. Herhangi bir değişiklik yaptığınızda, web sitenizi test etmeniz ve olası hataları kontrol etmeniz önemlidir. Hatalı bir sözdizimi, web sitenizin “500 Internal Server Error” hatası vermesine neden olabilir.
Sık Kullanılan .htaccess İşlevleri ve Örnekleri
.htaccess dosyasının gücü, sunduğu geniş işlevsellik yelpazesinden gelir. İşte en yaygın kullanılan işlevler ve pratik örnekler:
Yeniden Yönlendirmeler (Redirects)
Yeniden yönlendirmeler, bir URL’den başka bir URL’ye ziyaretçileri ve arama motorlarını yönlendirmek için kullanılır. Bu, web sitenizin yapısını değiştirdiğinizde, eski sayfaları yeni sayfalara yönlendirdiğinizde veya www olmayan adresleri www’liye yönlendirmek gibi durumlarda kritik öneme sahiptir.
* 301 Kalıcı Yönlendirme:
Bu, bir sayfanın kalıcı olarak yeni bir konuma taşındığını belirtir. SEO açısından önemlidir, çünkü arama motorlarına sayfanın tüm “link gücünün” yeni adrese aktarılması gerektiğini söyler.
Redirect 301 /eski-sayfa.html /yeni-sayfa.html
Tüm bir etki alanını yönlendirmek için:
Redirect 301 / http://www.yenisitem.com/
* 302 Geçici Yönlendirme:
Bu, bir sayfanın geçici olarak yeni bir konuma taşındığını belirtir. Arama motorları link gücünü aktarmaz. Bakım çalışmaları gibi kısa süreli yönlendirmeler için kullanılır.
Redirect 302 /bakimdaki-sayfa.html /gecici-sayfa.html
* www Olmayan Adresleri www’liye Yönlendirme:
Bu, SEO için önemlidir, çünkü sitenizin tek bir canonical URL’ye sahip olmasını sağlar.
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [L,R=301]
* HTTP’den HTTPS’ye Yönlendirme (SSL Zorlama):
Güvenlik ve SEO için tüm trafiği HTTPS’ye yönlendirmek kritik öneme sahiptir.
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
URL Yeniden Yazma (URL Rewriting) – mod_rewrite
mod_rewrite modülü, .htaccess’ın en güçlü özelliklerinden biridir. Karmaşık URL manipülasyonlarına olanak tanır, bu da dinamik web siteleri için SEO dostu ve kullanıcı dostu URL’ler oluşturmak için idealdir.
* mod_rewrite’ı Etkinleştirme:
Herhangi bir RewriteRule kullanmadan önce RewriteEngine On yönergesini eklemeniz gerekir.
RewriteEngine On
* Dostu URL’ler Oluşturma:
Dinamik bir URL’yi (örneğin, urun.php?id=123) daha temiz bir URL’ye (örneğin, urun/123) dönüştürmek.
RewriteEngine On
RewriteRule ^urun/([0-9]+)/?$ urun.php?id=$1 [NC,L]
Bu kural, /urun/123/ veya /urun/123 gibi bir isteği urun.php?id=123 olarak dahili olarak yeniden yazar. [NC] büyük/küçük harf duyarsızlığı, [L] ise bu kural eşleştiğinde başka kuralın uygulanmamasını sağlar.
* Dosya Uzantılarını Gizleme:
.php, .html gibi dosya uzantılarını URL’den kaldırma.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
Bu kural, mevcut bir dosya olmayan bir isteği (-f kontrolü) alır ve sonuna .php eklemeyi dener.
Güvenlik (Security)
.htaccess, web sitenizin güvenliğini artırmak için çeşitli yollar sunar.
* IP Adresi Engelleme:
Belirli IP adreslerinden veya IP bloklarından erişimi engelleme.
Order Deny,Allow
Deny from 192.168.1.100
Deny from 10.0.0.0/8
Allow from All
Belirli bir IP dışındaki tüm erişimi engellemek için:
Order Deny,Allow
Deny from All
Allow from 192.168.1.100
* Dizin Listelemesini Engelleme:
Ziyaretçilerin web sitenizdeki bir dizinin içeriğini görmesini engeller (örneğin, index.html veya index.php olmayan bir dizine girildiğinde). Bu, hassas dosyaların veya dizin yapısının açığa çıkmasını önler.
Options -Indexes
* Hassas Dosya Türlerine Erişimi Kısıtlama:
Örneğin, .htaccess dosyalarının kendilerine veya diğer yapılandırma dosyalarına (örneğin, .htpasswd) doğrudan erişimi engelleme.
Order allow,deny
Deny from all
Satisfy All
* Şifre Korumalı Dizinler:
Belirli bir dizine erişmek için kullanıcı adı ve şifre gerektirme. Bunun için .htpasswd adında bir şifre dosyası oluşturmanız ve sunucunuzda erişilemez bir yere koymanız gerekir.
AuthType Basic
AuthName "Kısıtlı Alan"
AuthUserFile /home/kullaniciadi/.htpasswd # .htpasswd dosyasının sunucudaki tam yolu
Require valid-user
Hata Sayfaları (Custom Error Pages)
Web sitenizde bir hata oluştuğunda (örneğin, sayfa bulunamadı), ziyaretçilere varsayılan sunucu hata mesajı yerine kendi tasarladığınız, daha kullanıcı dostu bir hata sayfası göstermek için kullanılır.
* Özel Hata Sayfası Tanımlama:
ErrorDocument 404 /404.html
ErrorDocument 403 /403.html
ErrorDocument 500 /500.html
Bu örnekte, 404.html, 403.html ve 500.html dosyaları web sitenizin kök dizininde bulunmalıdır.
Ön Bellekleme (Caching) ve Sıkıştırma (Compression)
Web sitesi performansını artırmak için tarayıcı önbelleklemesini ve Gzip sıkıştırmasını etkinleştirebilirsiniz.
* Tarayıcı Önbellekleme (Expires Headers):
Statik dosyaların (resimler, CSS, JS) tarayıcıda belirli bir süre önbelleğe alınmasını sağlar, böylece tekrarlanan ziyaretlerde daha hızlı yüklenirler.
ExpiresActive On
ExpiresByType image/jpg "access 1 year"
ExpiresByType image/jpeg "access 1 year"
ExpiresByType image/gif "access 1 year"
ExpiresByType image/png "access 1 year"
ExpiresByType text/css "access 1 month"
ExpiresByType application/javascript "access 1 month"
ExpiresByType application/x-javascript "access 1 month"
ExpiresByType text/html "access 1 week"
ExpiresDefault "access 1 month"
* Gzip Sıkıştırma (mod_deflate):
Web sunucusunun metin tabanlı dosyaları (HTML, CSS, JS) sıkıştırarak göndermesini sağlar, bu da dosya boyutunu küçültür ve yükleme sürelerini hızlandırır.
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
PHP Ayarları
.htaccess dosyası aracılığıyla PHP yapılandırma ayarlarını dizin bazında değiştirebilirsiniz. Bu, php.ini dosyasına erişiminiz olmadığında veya farklı dizinler için farklı PHP ayarları istediğinizde kullanışlıdır.
* PHP Değerlerini Ayarlama:
php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value memory_limit 128M
php_flag display_errors Off
php_value bir değer atarken, php_flag bir bayrağı (açık/kapalı) ayarlar.
Varsayılan Dizin Sayfası (Default Index Page)
Bir dizine erişildiğinde (örneğin, example.com/blog/), Apache’nin hangi dosyayı varsayılan olarak göstermesi gerektiğini belirler.
DirectoryIndex index.php index.html default.html
Bu kural, Apache’ye önce index.php‘yi, sonra index.html‘yi, sonra default.html‘yi aramasını söyler. Bulduğu ilk dosyayı gösterir.
.htaccess Kullanırken Dikkat Edilmesi Gerekenler
.htaccess güçlü bir araç olsa da, dikkatsiz kullanım ciddi sorunlara yol açabilir.
Performans Etkisi
Her web isteğinde Apache, ilgili dizin ve tüm üst dizinlerdeki .htaccess dosyalarını okur ve ayrıştırır. Çok sayıda .htaccess dosyası veya karmaşık kurallar içeren dosyalar, sunucu performansını olumsuz etkileyebilir. Mümkünse, sunucu genelindeki yapılandırmalar (httpd.conf) tercih edilmelidir, çünkü bunlar bir kez yüklenir ve her istekte yeniden işlenmez. Paylaşımlı barındırma ortamlarında bu genellikle bir seçenek değildir, bu yüzden .htaccess’i dikkatli kullanmak önemlidir.
Sözdizimi Hataları
.htaccess dosyalarındaki en ufak bir sözdizimi hatası, web sitenizin “500 Internal Server Error” hatası vermesine neden olabilir. Bu, sunucunun dosyayı ayrıştıramadığı veya geçersiz bir yönergeyle karşılaştığı anlamına gelir. Her zaman küçük değişiklikler yapın ve her değişiklikten sonra web sitenizi test edin. Büyük değişiklikler yapmadan önce dosyanın bir yedeğini almak iyi bir uygulamadır.
AllowOverride Yönergesi
.htaccess dosyalarının işlevselliği, Apache’nin ana yapılandırma dosyasındaki (httpd.conf) AllowOverride yönergesi tarafından kontrol edilir. Bu yönerge, .htaccess dosyalarında hangi tür yönergelerin kullanılabileceğini belirler. Örneğin, AllowOverride None ise hiçbir .htaccess yönergesi çalışmaz. AllowOverride All ise tüm yönergelere izin verir. Paylaşımlı barındırma sağlayıcıları genellikle performans ve güvenlik nedenleriyle belirli yönerge türlerine izin verir (örneğin, AllowOverride FileInfo AuthConfig Indexes). Kendi sunucunuzu yönetiyorsanız, bu ayarı ihtiyaçlarınıza göre yapılandırabilirsiniz.
Kapsam ve Miras Alma
.htaccess dosyaları, bulunduğu dizin ve tüm alt dizinleri için geçerlidir. Alt dizinlerdeki .htaccess dosyaları, üst dizinlerdeki aynı yönergeleri geçersiz kılabilir. Bu, belirli bir alt dizin için farklı kurallar belirlemenize olanak tanır, ancak aynı zamanda beklenmedik davranışlara da yol açabilir. Kuralların sıralaması ve hangi dizinde hangi kuralın etkili olacağı konusunda dikkatli olmak gerekir. RewriteBase yönergesi, mod_rewrite kurallarının temel yolunu belirtmek için kullanışlıdır ve özellikle bir alt dizinde çalışırken önemlidir.
Güvenlik Riskleri
Yanlış yapılandırılmış bir .htaccess dosyası, web sitenizde güvenlik açıkları yaratabilir. Örneğin, Options +Indexes komutunu yanlışlıkla etkinleştirmek, ziyaretçilerin dizinlerinizin içeriğini görmesine neden olabilir. Hassas bilgileri (veritabanı kimlik bilgileri gibi) .htaccess dosyasına doğrudan yazmaktan kaçının. Şifre korumalı dizinler için kullanılan .htpasswd dosyasını asla web kök dizininin içine koymayın; aksi takdirde herkes tarafından erişilebilir hale gelebilir.
Gelişmiş .htaccess İpuçları
Temel kullanım alanlarının ötesinde, .htaccess dosyası daha gelişmiş senaryolar için de kullanılabilir.
Çevre Değişkenleri (Environment Variables)
PHP veya diğer sunucu tarafı uygulamalarınız için özel ortam değişkenleri ayarlayabilirsiniz.
SetEnv APP_ENV production
SetEnv DB_HOST localhost
Bu değişkenlere PHP’de $_SERVER['APP_ENV'] veya getenv('APP_ENV') ile erişilebilir.
MIME Türleri
Tarayıcının belirli dosya türlerini doğru şekilde yorumlamasını sağlamak için MIME türlerini belirleyebilirsiniz. Bu, özellikle özel dosya türleri veya web fontları kullanırken faydalıdır.
AddType application/x-font-woff .woff
AddType application/font-woff2 .woff2
AddType image/svg+xml .svg .svgz
Karakter Kümeleri
Web sitenizin varsayılan karakter kümesini belirleyerek, tarayıcıların içeriği doğru şekilde görüntülemesini sağlayabilirsiniz. UTF-8, modern web siteleri için standarttır.
AddDefaultCharset UTF-8
Sorun Giderme (Troubleshooting)
.htaccess dosyalarıyla çalışırken sorunlarla karşılaşmak yaygındır. İşte en sık karşılaşılan sorunlar ve çözümleri:
500 Internal Server Error
Bu, .htaccess dosyasıyla ilgili en yaygın hatadır ve genellikle bir sözdizimi hatasından kaynaklanır.
* Son Değişiklikleri Kontrol Edin: Hatayı tetikleyen son değişikliği geri alın.
* Satır Satır Yorum Satırı Yapın: .htaccess dosyanızdaki kuralları tek tek yorum satırı yaparak (satırın başına # koyarak) hangi kuralın hataya neden olduğunu bulmaya çalışın.
* Apache Hata Günlüklerini Kontrol Edin: Sunucunuzun hata günlükleri (error logs), hatanın tam nedenini genellikle açıkça belirtir. Bu günlükler genellikle cPanel veya barındırma kontrol paneliniz aracılığıyla erişilebilir.
* Sözdizimini Kontrol Edin: Yönergelerin doğru yazıldığından, açılış/kapanış etiketlerinin () eşleştiğinden ve boşlukların/satır sonlarının doğru olduğundan emin olun.
Kuralların Çalışmaması
Bir kuralı eklediniz ama beklediğiniz gibi çalışmıyor olabilir.
* AllowOverride Ayarını Kontrol Edin: Apache’nin ana yapılandırmasında (httpd.conf) veya barındırma sağlayıcınızın ayarlarında, kullanmaya çalıştığınız yönerge türüne izin verilip verilmediğini kontrol edin. Örneğin, mod_rewrite kurallarının çalışması için AllowOverride FileInfo veya AllowOverride All gerekir.
* mod_rewrite‘ın Etkin Olduğundan Emin Olun: RewriteEngine On yönergesinin dosyanın başında olduğundan emin olun.
* Kuralların Sıralaması: Kuralların sırası önemlidir. Bazı kurallar diğerlerini engelleyebilir veya beklenmedik sonuçlar doğurabilir. En spesifik kuralları en üste, daha genel kuralları alta koymayı deneyin.
* Yol ve Düzenli İfade (Regex) Kontrolü: RewriteRule ve RewriteCond içindeki düzenli ifadelerin doğru olduğundan ve yolların doğru şekilde eşleştiğinden emin olun.
* RewriteLog ve RewriteLogLevel: Kendi sunucunuzu yönetiyorsanız, Apache yapılandırmasında RewriteLog ve RewriteLogLevel yönergelerini etkinleştirerek mod_rewrite‘ın nasıl çalıştığını detaylı olarak görebilirsiniz.
Sonuç
.htaccess dosyası, Apache web sunucusu kullanıcıları için inanılmaz derecede güçlü ve esnek bir araçtır. URL yönlendirmeleri ve yeniden yazma işlemlerinden güvenlik önlemlerine, performans optimizasyonlarından özel hata sayfalarına kadar geniş bir yelpazede web sitesi yapılandırma görevlerini yerine getirebilir. Özellikle paylaşımlı barındırma ortamlarında, sunucu genelindeki ayarlara erişimi olmayan web yöneticileri ve geliştiriciler için vazgeçilmezdir.
Ancak, .htaccess kullanırken dikkatli olmak ve her zaman en iyi uygulamaları takip etmek hayati öneme sahiptir. Yanlış bir sözdizimi veya hatalı bir kural, web sitenizin erişilemez hale gelmesine neden olabilir. Bu nedenle, herhangi bir değişiklik yapmadan önce daima dosyanın yedeğini alın, küçük değişiklikler yapın ve her değişikliği titizlikle test edin. Sunucu günlüklerini kontrol etme alışkanlığı edinmek, sorun giderme sürecinde size çok yardımcı olacaktır.
Bu rehber, .htaccess dosyasının temel ve gelişmiş kullanım alanlarını kapsamlı bir şekilde ele alarak, bu güçlü aracı daha etkin ve güvenli bir şekilde kullanmanız için size yol göstermeyi amaçlamıştır. Doğru bilgi ve dikkatli uygulama ile .htaccess, web sitenizin kontrolünü elinize almanızı ve kullanıcı deneyimini önemli ölçüde iyileştirmenizi sağlayacaktır.
