Alan adınızı değiştirdiğinizde, siteyi HTTPS'e geçirdiğinizde ya da uzun ve teknik görünen adreslerinizi hem ziyaretçiye hem arama motoruna okunaklı hale getirmek istediğinizde karşınıza çıkan ilk çözüm çoğunlukla .htaccess dosyasıdır. Apache üzerinde çalışan hemen hemen her paylaşımlı hosting hesabında, bu tek dosyaya yazacağınız birkaç satırla oldukça güçlü davranışlar tanımlayabilirsiniz: bir sayfayı bir başkasına taşımak, www olmadan gelen ziyaretçileri www'lu sürüme (ya da tam tersine) göndermek, gelen tüm trafiği güvenli bağlantıya çevirmek veya sorgu parametreleriyle dolu adresleri sade ve kalıcı adreslere dönüştürmek.
Bu rehberde .htaccess dosyasının ne işe yaradığını, mod_rewrite modülünün mantığını, 301 ile 302 yönlendirmeler arasındaki farkı, tekil sayfa ve dizin yönlendirmelerini, www ve HTTPS zorlamayı, temiz URL üretmeyi, özel hata sayfalarını ve tarayıcı önbellek başlıklarını çalışan örneklerle ele alacağız. Sonunda elinizde, kendi sitenize güvenle uyarlayabileceğiniz denenmiş kural blokları olacak.
.htaccess Dosyası Nedir?#
.htaccess (açılımıyla hypertext access), Apache web sunucusunun dizin bazında okuduğu bir yapılandırma dosyasıdır. Adının başındaki noktadan da anlaşılacağı gibi gizli bir dosyadır ve çoğunlukla sitenizin kök dizininde, yani public_html, www ya da htdocs klasörünün içinde durur. Apache bir isteği karşılarken, hedef dosyaya giden yol boyunca her dizine bakar; hangi klasörde .htaccess bulursa oradaki kuralları o istekte uygular.
Bu dosyanın esas gücü, sunucunun ana yapılandırmasına (httpd.conf) hiç dokunmadan yalnızca kendi hesabınıza özel ayar yapabilmenizden gelir. Paylaşımlı hosting ortamlarında ana yapılandırmaya erişiminiz zaten olmadığından, .htaccess pratikte elinizdeki tek yönetim aracıdır. Üstelik değişiklikler sunucuyu yeniden başlatmaya gerek kalmadan hemen devreye girer, çünkü Apache dosyayı her istekte baştan okur.
Aklınızda tutmanız gereken birkaç nokta var:
- Dosyanın adı harfi harfine
.htaccess'tir; herhangi bir uzantısı yoktur, yalnızca başında bir nokta bulunur. - Bu dosyayı yalnızca Apache ve LiteSpeed gibi Apache uyumlu sunucular okur. Nginx
.htaccessdosyasını hiç dikkate almaz; orada yönlendirmeler doğrudan sunucu bloklarında (server/location) tanımlanır. - Tek bir yazım hatası bile bütün siteyi 500 Internal Server Error ile çökertebilir. Bu yüzden herhangi bir düzenlemeye başlamadan önce mutlaka mevcut dosyanın yedeğini alın.
Dosyayı düzenlemek için hosting kontrol panelindeki Dosya Yöneticisi'ni ya da bir FTP istemcisini kullanabilirsiniz. Kontrol panelinin nasıl çalıştığını daha yakından görmek isterseniz cPanel nedir yazımıza bakabilirsiniz.
mod_rewrite'ı Anlamak#
Düz ve koşulsuz yönlendirmeler için mod_alias modülünün Redirect komutu çoğu zaman yeter. Ancak koşula bağlı ya da desen tabanlı işlemlerde devreye mod_rewrite girer. Bu modül, gelen adresi düzenli ifadelerle (regex) eşleştirip yeniden yazmanıza olanak tanır ve .htaccess dünyasının asıl motorudur.
mod_rewrite kullanan hemen her blok şu satırla başlar:
RewriteEngine On
Bu satırın hemen ardından iki temel yönerge gelir:
RewriteCond— bir koşul tanımlar. Hemen altındaki kural yalnızca bu koşul sağlandığında çalışır (örneğin "istek HTTPS üzerinden gelmiyorsa").RewriteRule— asıl eşleştirme ve dönüştürme işini yapan kuraldır. Bir desenle adresin bir bölümünü yakalar ve hedefe yönlendirir.
Kimi zaman kuralların kök dizine göre nasıl çalışacağını netleştirmek için RewriteBase / satırını da eklemeniz gerekir; alt dizinlerde çalışan kurulumlarda bu satır, göreli yolların doğru çözülmesine yardımcı olur.
RewriteRule satırının sonuna köşeli parantez içinde eklenen bayraklar davranışı belirler. En sık kullandıklarınız şunlardır:
[R=301,L]— kalıcı yönlendirme (R=301) yapar ve bu kuraldan sonra işlemeyi durdurur (L, yani last).[R=302,L]— aynısını geçici yönlendirme olarak yapar.[NC]— büyük/küçük harf ayrımı gözetmeden eşleştirir (no case).[QSA]— var olan sorgu dizesini yeni adrese ekler, silmez (query string append).[L]— tek başına kullanıldığında, dahili yeniden yazmalarda kuralı sonlandırıp bir sonraki isteği baştan başlatır.
301 mi, 302 mi? Kalıcı ve Geçici Yönlendirmeler#
Bir yönlendirmede seçtiğiniz HTTP durum kodu boş bir ayrıntı değildir; hem tarayıcılar hem de arama motorları bu koda göre davranır.
| Kod | Anlamı | Ne zaman kullanılır | SEO etkisi |
|---|---|---|---|
| 301 | Kalıcı taşındı | Alan adı/URL kalıcı olarak değiştiyse | Link değeri (otorite) yeni adrese aktarılır |
| 302 | Geçici taşındı | Bakım, A/B test, kısa süreli değişiklik | Eski URL indekste kalır, değer aktarılmaz |
Temel kural açık: adres kalıcı olarak değiştiyse 301 kullanın. Bir ürün sayfasını yeni bir kategoriye taşıdıysanız, eski bir blog yazısını farklı bir adrese çektiyseniz ya da doğrudan alan adınızı değiştirdiyseniz doğru seçim 301'dir. Arama motorları 301 gördüğünde eski adresin zamanla biriktirdiği otoriteyi büyük ölçüde yeni adrese devreder ve eski URL'yi kademeli olarak indeksten çıkarır.
302'yi ise gerçekten geçici durumlar için saklayın. Kalıcı bir taşımada yanlışlıkla 302 kullanırsanız, arama motoru "bu değişiklik geçici, eski adresi indekste tutalım" diye yorumlar; bu da yeni adresinizin sıralamada hak ettiği yeri almasını geciktirir.
Tekil Sayfa ve Dizin Yönlendirme#
En sık karşılaşacağınız iş, tek bir sayfayı ya da bütün bir dizini başka bir adrese göndermektir. Basit senaryolarda mod_alias fazlasıyla yeterlidir:
# Tek bir sayfayı kalıcı yönlendir
Redirect 301 /eski-sayfa.html https://siteniz.com/yeni-sayfa/
# Bir dizinin tamamını yönlendir (alt yollar korunur)
Redirect 301 /blog https://siteniz.com/makaleler
İkinci örnekte /blog/nginx-kurulumu adresi kendiliğinden /makaleler/nginx-kurulumu adresine gider; çünkü Redirect yönergesi eşleşen ön ekten sonra gelen alt yolu olduğu gibi hedefe ekler. Bu davranış, koca bir bölümü taşırken tek tek sayfa yazmaktan sizi kurtarır.
Daha esnek ve koşullu eşleşmeler gerektiğinde ise mod_rewrite'a geçilir. Örneğin .html uzantılı tüm eski adresleri uzantısız yeni yapıya taşımak isterseniz:
RewriteEngine On
RewriteRule ^(.*)\.html$ /$1 [R=301,L,NC]
Burada ^(.*)\.html$ deseni uzantıdan önceki bölümü yakalar, $1 ile onu geri kullanır ve .html kısmını atarak kalıcı yönlendirme kurar. Hedef adreste artık .html bulunmadığı için bu kural kendi çıktısıyla yeniden eşleşmez, yani sonsuz döngüye girmez. Bir alan adından başka bir alan adına toplu geçiş yapıyorsanız site taşıma hizmetimiz bu yönlendirmelerin bağlantı değeri kaybetmeden kurulmasında size yardımcı olabilir.
www ve HTTPS Zorlama#
Bir sitenin aynı anda hem www'lu hem www'suz, hem http hem https sürümünden açılabilmesi, arama motorlarının tek içeriği dört ayrı adreste görmesine, yani yinelenen içerik (duplicate content) sorununa yol açar. Bu yüzden tek bir tercih edilen (canonical) adrese yönlendirmek önemlidir.
HTTPS'e Zorlama#
Bütün http trafiğini güvenli https bağlantısına çevirmek için:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Buradaki RewriteCond %{HTTPS} off koşulu, kuralın yalnızca şifrelenmemiş bağlantılarda tetiklenmesini sağlar; zaten HTTPS üzerinden gelen istekler dokunulmadan geçer ve gereksiz bir döngü oluşmaz. %{HTTP_HOST} ve %{REQUEST_URI} değişkenleri sayesinde ziyaretçi hangi sayfada olursa olsun tam olarak aynı sayfanın HTTPS sürümüne yönlenir. Bu kuralın işe yaraması için elbette geçerli bir SSL sertifikanızın kurulu olması gerekir; ücretsiz ve ticari SSL seçeneklerimize göz atabilir, konunun ayrıntısını HTTPS yönlendirme yazımızda bulabilirsiniz.
www Ekleme veya Kaldırma#
www'suz adresi tercih ediyorsanız (www.siteniz.com → siteniz.com):
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Tersini istiyorsanız (siteniz.com → www.siteniz.com):
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Burada iki geri-referansı karıştırmamak önemli: %1 ifadesi bir önceki RewriteCond satırındaki parantezle yakalanan grubu, $1 ise RewriteRule deseninin parantezle yakaladığı grubu temsil eder. İkisini yer değiştirmek yönlendirmeyi bozar. Ayrıca yukarıdaki iki örnek de hedefi https:// olarak yazdığı için www düzenlemesini yaparken bir yandan HTTPS'i de zorlar; sitenizde SSL yoksa hedefi geçici olarak http:// bırakabilirsiniz.
İpucu: HTTPS ve www kurallarını tek bir blokta birleştirmek mümkündür, ancak koşulları ayrı ayrı yazmak hem daha okunabilir olur hem de bir sorun çıktığında hangi kuralın tetiklendiğini bulmayı kolaylaştırır.
Temiz (SEO Dostu) URL Üretme#
Dinamik siteler çoğu zaman urun.php?id=42&kategori=3 gibi ezberlenmesi zor, sıralaması dağınık adresler üretir. Temiz URL yeniden yazmayla ziyaretçiye urun/kablosuz-kulaklik gibi sade bir adres gösterir, perde arkasında ise isteği ilgili PHP dosyasına iletirsiniz. Böylece adresler hem insana hem arama motoruna anlamlı gelir.
Diyelim ki ziyaretçi tarayıcıda siteniz.com/urun/kablosuz-kulaklik adresini görsün, ama sunucu aslında arka planda urun.php?slug=kablosuz-kulaklik dosyasını çalıştırsın istiyorsunuz:
RewriteEngine On
RewriteRule ^urun/([a-zA-Z0-9-]+)/?$ urun.php?slug=$1 [L,QSA]
Bu kuralda dikkat etmeniz gereken noktalar şunlar:
([a-zA-Z0-9-]+)deseni yalnızca harf, rakam ve tire içeren slug'ları kabul eder; bu, hem güvenli hem de öngörülebilir bir sınırlamadır./?$sondaki eğik çizgiyi isteğe bağlı kılar, böylece hem/urun/xhem de/urun/x/sorunsuz çalışır.[L,QSA]bayrakları kuralı sonlandırır ve?renk=siyahgibi ek sorgu parametrelerini korur.
Modern uygulama çatılarında (WordPress, Laravel ve benzeri) çok yaygın bir kalıp da vardır: var olmayan dosya ve dizinlere gelen tüm istekleri tek bir index.php giriş noktasına yönlendirmek. Bu sayede tüm istekleri uygulamanın yönlendiricisi karşılar.
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [L]
Bu iki koşul birlikte "istenen şey gerçek bir dosya değilse (!-f) ve gerçek bir dizin de değilse (!-d)" anlamına gelir. Yani var olan resim, CSS ve JavaScript dosyaları doğrudan sunulur; geri kalan bütün istekler uygulamanızın giriş dosyasına düşer. Bir WordPress hosting sitesi kullanıyorsanız buna çok benzer bir bloğu WordPress'in kalıcı bağlantı ayarı zaten kendisi ekler.
Özel Hata Sayfaları#
Ziyaretçi olmayan bir sayfaya girdiğinde ya da sunucuda bir hata oluştuğunda, Apache'nin çıplak varsayılan mesajı yerine kendi tasarımınıza uygun bir sayfa göstermek hem daha profesyonel durur hem de ziyaretçiyi sitede tutar:
ErrorDocument 404 /hatalar/404.html
ErrorDocument 403 /hatalar/403.html
ErrorDocument 500 /hatalar/500.html
Yolların başındaki eğik çizgi (/) küçük ama kritik bir ayrıntıdır; bu çizgi, dosyayı hangi sayfada olursanız olun site kökünden itibaren aramasını sağlar. Özel 404 sayfanıza bir arama kutusu, sık ziyaret edilen bağlantılar ve ana sayfaya dönüş bağlantısı eklemek, kaybolan ziyaretçiyi geri kazanma şansınızı artırır. Yalnız önemli bir uyarı: 404 sayfası tarayıcıya yine HTTP 404 durum kodunu döndürmeye devam etmeli. Onu yanlışlıkla 200 koduyla döndürürseniz arama motorlarında "soft 404" sorunu doğar ve boş sayfalar indekslenmeye başlar.
Tarayıcı Önbellek Başlıkları#
.htaccess üzerinden statik dosyalara önbellek başlıkları ekleyerek hem ilk yükleme hızını hem de tekrar ziyaretlerdeki performansı belirgin biçimde iyileştirebilirsiniz. mod_expires modülü etkinse, aşağıdaki blok resim, CSS ve JavaScript dosyalarının tarayıcıda ne kadar saklanacağını tanımlar:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpeg "access plus 1 year"
ExpiresByType image/png "access plus 1 year"
ExpiresByType image/webp "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
ExpiresByType application/javascript "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 year"
</IfModule>
access plus 1 year ifadesi, tarayıcıya o dosyayı bir yıl boyunca yeniden indirmemesini söyler. Sık değişen dosyalar için daha kısa süreler seçin; sürüm çıkardığınızda önbelleğin takılıp kalmaması için de dosya adına bir sürüm etiketi eklemek (örneğin style.v3.css) en pratik yöntemdir. Gzip ya da Brotli sıkıştırması için mod_deflate da benzer bir mantıkla ayarlanabilir; önbellek başlıklarıyla birlikte kullanıldığında sayfa boyutunu ve yükleme süresini gözle görülür şekilde düşürür.
Dikkat Edilmesi Gerekenler#
.htaccess ne kadar güçlüyse o kadar da dikkat isteyen bir araçtır. Yayına almadan önce şu noktaları gözden geçirin:
- Yalnızca Apache/LiteSpeed: Sunucunuz Nginx tabanlıysa bu dosya hiç okunmaz ve kuralların hiçbiri çalışmaz. Hosting paketinizin Apache ya da LiteSpeed üzerinde çalıştığından emin olun; paylaşımlı hosting paketlerimiz LiteSpeed üzerinde çalışır ve
.htaccessile tam uyumludur. - Performans: Apache dosyayı her istekte yeniden okuduğu için
.htaccesskuralları ana yapılandırmaya göre bir miktar ek yük getirir. Kendi sunucunuzu yönettiğiniz bir VDS ya da sanal sunucuda kuralları doğrudan sunucu yapılandırmasına taşımak daha performanslıdır; ancak paylaşımlı ortamda.htaccesstek seçenektir ve normal yükler altında bu farkın etkisi çoğu zaman ihmal edilebilir. - Yedek alın: Herhangi bir düzenlemeden önce mevcut dosyanın bir kopyasını
.htaccess.bakadıyla saklayın. Tek bir yazım hatası siteyi tümüyle erişilemez hale getirebilir; böyle bir durumda yeni dosyayı silip yedeği geri koymak sizi hızla ayağa kaldırır. Otomatik yedekler için yedekleme çözümlerimize bakabilirsiniz. - Sıralama önemlidir: Kurallar yukarıdan aşağıya doğru işlenir. Yönlendirme döngülerine düşmemek için genel kuralları daha özel kuralların altına yerleştirin ve
[L]bayrağını yerinde kullanın. - Regex'i test edin: Karmaşık
RewriteRuledesenlerini canlıya almadan önce bir test alanında ya da alt alan adında deneyin. Yanlış kurgulanmış bir düzenli ifade, fark etmesi zor yönlendirme zincirlerine ve beklenmedik hatalara yol açabilir.
Sıkça Sorulan Sorular#
.htaccess dosyasında yaptığım değişiklik ne zaman geçerli olur?#
Değişiklikler pratikte anında geçerli olur. Apache .htaccess dosyasını her istekte yeniden okuduğundan sunucuyu yeniden başlatmanız gerekmez; dosyayı kaydedip tarayıcıda sayfayı yenilemeniz yeterlidir. Yönlendirmelerde tarayıcı, özellikle 301'i güçlü biçimde önbelleğe alabildiği için test ederken gizli sekme kullanmak ya da tarayıcı önbelleğini temizlemek yanıltıcı sonuçları önler.
301 ile 302 yönlendirme arasında nasıl seçim yaparım?#
Adres değişikliği kalıcıysa 301, geçiciyse 302 kullanın. 301, eski adresin arama motoru otoritesini yeni adrese aktardığı için SEO açısından tercih edilendir; 302 ise eski URL'yi indekste tutar ve yalnızca bakım ya da kısa süreli deneme gibi durumlarda anlamlıdır. Kararsız kaldıysanız ve taşıma kalıcı görünüyorsa, güvenli seçim 301'dir.
.htaccess değişikliğinden sonra sitem 500 hatası veriyor, ne yapmalıyım?#
Bu hata genellikle bir yazım yanlışından, sunucuda desteklenmeyen bir yönergeden ya da eksik bir modülden kaynaklanır. İlk yapılacak şey, en son eklediğiniz bloğu her satırın başına # koyarak geçici olarak yorum satırına almak ya da doğrudan yedekten geri dönmektir. Sorun sürerse hosting panelindeki hata kayıtlarını (error log) inceleyerek tam olarak hangi satırın hataya yol açtığını görebilirsiniz.
mod_rewrite'ın açık olup olmadığını nasıl anlarım?#
En pratik yol, basit bir yeniden yazma kuralı yazıp çalışıp çalışmadığını denemektir. Kural çalışmıyor ya da 500 hatası alıyorsanız modül kapalı olabilir. Çoğu paylaşımlı hosting ortamında mod_rewrite varsayılan olarak etkindir; yine de emin olamıyorsanız hosting sağlayıcınıza sorarak birkaç dakikada öğrenebilirsiniz.
www ve HTTPS yönlendirmesini aynı anda yapabilir miyim?#
Evet. İki ayrı RewriteRule bloğunu aynı .htaccess dosyasında art arda yazabilir ya da dilerseniz tek bir kuralda birleştirebilirsiniz. Okunabilirlik ve hata ayıklama kolaylığı düşünüldüğünde ikisini ayrı bloklar halinde tutmak, her şeyi tek satıra sıkıştırmaktan genellikle daha sağlıklıdır.
WordPress kurulumumda .htaccess dosyasını elle düzenlemeli miyim?#
WordPress, kalıcı bağlantı ayarlarını her kaydettiğinizde gerekli yeniden yazma bloğunu otomatik ekler, dolayısıyla çoğu durumda elle müdahaleye gerek kalmaz. Ekstra bir yönlendirme veya güvenlik kuralı ekleyecekseniz, WordPress'in # BEGIN WordPress ile # END WordPress satırları arasına yazdığı bloğun dışına yazmaya özen gösterin; aksi halde bir sonraki güncelleme kendi bloğunu yeniden ürettiğinde değişiklikleriniz silinebilir.
.htaccess, doğru kullanıldığında sitenizin adres yapısını, güvenliğini ve hızını tek bir dosyadan yönetmenizi sağlayan sade ama etkili bir araçtır. Kuralları küçük adımlarla ekleyip her değişiklikten sonra test ederek ilerlerseniz, yönlendirme kaynaklı sorunların büyük kısmını daha ortaya çıkmadan engellersiniz. Kararlı ve .htaccess ile tam uyumlu bir altyapı arıyorsanız hosting paketlerimizi inceleyebilir, taşıma sürecinde yönlendirmelerin sorunsuz kurulması için ekibimizden destek isteyebilirsiniz.