RSS

PHP htaccess kullanımı

129 08 Temmuz 2012 ~ Musa Avcı — Orta

Htaccess; web alanında birçok faydalı yönlendirme işlerinin  yapılmasını sağlayan, Apache web sunucularında olan etkili ve çok amaçlı bir ayar dosyasıdır.

Web projelerinizi bir çok şekilde düzene sokup kullanıcı dostu URL’ler yapmamıza ve bir takım yollarla güvenlik önlemleri de almanıza yarayan ve bu alanda en favori olaylarımdan bir tanesidir.

Htaccess ile neler yapabiliriz?

  • SEO dostu URL’ler oluşturabilme.
    site.com/icerik.php?id=123 yerine site.com/icerik-basligi gibi
  • Subdomain ya da dizin yönlendirmeleri.
    site.com girildiğinde www.site.com’a yönlendirme gibi
  • “404 sayfa bulunamadı” gibi tüm hata sayfalarını istenilen yere yönlendirebilme.
    site.com/olmayan-sayfa-asdasd girildiğinde sizin belirlediğiniz bir sayfa açılabilir.
  • Sitenizin tamamına ya da bir dizine sadece belirli bir IP’nin girebilmesini sağlayabilirsiniz.
    Siteniz yapım aşamasındayken sadece sizin girip diğerlerini yapım aşamasında sayfasına yönlendirebilirsiniz. 
  • Özel dizinlere erişim engelleme.
    Sadece include edilen php dosyalarının olduğu bir klasörün kullanıcılar tarafından girilmesini engelleyebilirsiniz.
  • Bazı web servisi botlarının sitenizi taramasını engelleyebilirsiniz.
    Hoşunuza gitmeyen bir web arama motorunun ya da spam bir web servisinin sitenizi taramasını engelleyebilirsiniz. 
  • Özel dizinlerinizi şifreleyebilirsiniz.
    PHP ile bir dizin kontrol sistemi yazmaya uğraşmak yerine hemen bir kaç satır htaccess komutu ile istediğiniz dizine şifre ile girilmesini sağlayabilirsiniz.
  • Resimlerinizin başka sitelerde görünmesini engelleyebilirsiniz.
    Başka sitelerde sizin sitenizdeki resimlerin gösterilmesini engelleyerek sunucunuzun bant genişliğin başka sitelerce harcanmasını önleyebilirsiniz. (bu yöntemin adı hotlink diye geçer)
  • Ve bu yukarıda sayılanların haricinde bu yöntemleri bir arada kullanarak çok daha fazlasını yapabilirsiniz.

Hadi şimdi sırayla bu yukarıda saydıklarımın nasıl yapıldığına bakalım.

SEO ve kullanıcı dostu bağlantılar oluşturma

Htaccess’in en popüler kullanım alanlarından birisi budur. Ve sizin de en sevdiğiniz özelliklerinden birisi olacağına inanıyorum.

Bu olayı kullanmanın 2 ideal yöntemi var; birincisi önceden öğrendiğimiz GET metodu ile sayfa.php?sayfa=iletisim şeklinde, ya da POST metodu gibi “REQUEST_URI” ile kullanmak. Hangisi kolayınıza geliyorsa onu seçebilirsiniz fakat benim favorim “REQUEST_URI”den yana.

Yöntem 1: GET metodu kullanarak yapmak.

Öncelikle bir içerik sayfa.php‘miz olsun ve örnek amaçlı switch ile sayfaları tanımlayalım:

if(!isset($_GET['sayfa'])) { // eğer boşsa anasayfa varsayalım.
   $sayfa = 'anasayfa';
} else {
   $sayfa = $_GET['sayfa'];
}

switch($sayfa) {
case 'iletisim':
   echo '<h2>İletişim</h2>';
   echo '<p>Bize [email protected] adresinden ulaşın!</p>';
   echo '<p><a href="/">Anasayfa</a></p>';
   break;

case 'hakkinda':
   echo '<h2>Hakkında</h2>';
   echo '<p>Bizi tanıyan tanır, yeniler örnek alır, tanımayanlar ibret alır.</p>';
   echo '<p><a href="/">Anasayfa</a></p>';
   break;

case 'anasayfa':
   echo '<h2>Sitemize hoşgeldiniz!</h2>';
   echo '<p><a href="/hakkinda">Hakkında</a><br/>';
   echo '<a href="/iletisim">İletişim</a></p>';
   break;

default: // hiç birisi değilse 404 varsayalim
   echo '<h2>Bulunamadı!</h2>';
   echo '<p>Böyle bir sayfamız henüz yok, değiştirilmiş ya da silinmiş olabilir.</p>';
}

Şuan htaccess kullanmadan bu sayfamızı “sayfa.php, sayfa.php?sayfa=hakkinda, sayfa.php?sayfa=iletisim” şeklinde kullanabiliriz. Şimdi gelelim bunu kullanıcı dostu yapmamıza, bu kısımda kod kısmımızda herhangi bir şey değiştirmemize gerek yok.

Sitemizin ana dizinine “.htaccess” adında dosya oluşturuyoruz. Eğer FTP programınız ya da işletim sisteminiz böyle bir dosya oluşturmanıza izin vermiyorsa, not defterinden boş bir sayfa açıp kodları içerisine yazıp, farklı kaydet diyip, “Tüm dosyalar” seçeneğini seçip “.htaccess” yazıp bu dosyayı oluşturabilirsiniz.

İçerisine şu satırları yazıyoruz:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ sayfa.php?sayfa=$1 [QSA,L]

Bu işlemi yaptıktan sonra Htaccess; kullanıcılar eğer olmayan bir sayfaya girmeye çalışırlarsa, yani normalde /hakkinda ya da /iletisim gibi bir dizinimiz olmadığı için, 404 hata sayfasına değil de bizim sayfa.php dosyamıza yönlendirecek.

Fakat yönlendirirken girilmiş olan sayfayı bizim dosyamıza “sayfa” GET parametresi olarak gönderek. Yani bu şekilde site.com/deneme diye girildiğinde arkaplanda çalışacak olan sayfa “site.com/sayfa.php?sayfa=deneme” olacaktır.

Sonuç olarak yine aynı sistem çalışsa da kullanıcılar artık php dosyalarının adını ya da diğer GET parametresi uzantılarını yazmasına gerek kalmadan temiz ve akılda kalıcı bağlantılarla sitenizde gezebiliyor.

Yöntem 2: REQUEST_URI ile yapmak.

Diğer yöntemden tek farkı $_GET[‘sayfa’] yerine girilen adresi $_SERVER[‘REQUEST_URI’] ile okuyoruz. Fakat burada bize ilk baştaki “/” işaretini de veriyor (“/hakkinda” şeklinde). Bunun için ilk karekteri substr fonksiyonu ile atlıyoruz.

Yani kod kısmımızın ilk 5 satırını şöyle değiştireceğiz:

$sayfa = substr($_SERVER['REQUEST_URI'], 1); // ilk "/" karakterini atlıyoruz.
if(!empty($sayfa)) { // eğer boşsa anasayfa varsayalım.
   $sayfa = 'anasayfa';
}

.htaccess dosyamızda da bu yöntem için bir satırlık değişiklik yapıyoruz, GET parametresi tanımladığımız kısmı siliyoruz:

RewriteRule ^(.*)$ sayfa.php?sayfa=$1 [QSA,L]
// yerine
RewriteRule ^(.*)$ sayfa.php [L]

Subdomain ya da dizin yönlendirme

Bu blog üzerinde bir örneğini görebilirsiniz; phpr.org diye girmeye çalıştığınızda sizi otomatik olarak www.phpr.org adresine yönlendirir.  Buradaki mevzu kişinin zevkine de bağlı olsa da daha çok arama motorları ile alakalı. Bazı durumlarda Google sitenizin “www” ekli olan ve olmayan halini farklı iki site gibi değerlendirebiliyor. Mesela bir sitenizin bir çok yerde linki hem “www” ile hem de olmadan paylaşılınca kısmen domain popülerliğini dağıtmış oluyor.

Htaccess ile “www” olmadan girildiğinde ekleyerek kalıcı yönlendirme yapıldığında tüm ilgiler tek bir subdomain ve domainde toplanıyor.

RewriteEngine On
RewriteCond %{HTTP_HOST} phpr.org [nc]
RewriteRule (.*) //www.phpr.org/$1 [R=301,L]

İsterseniz tam tersini de yapabilirsiniz;

RewriteEngine On
RewriteCond %{HTTP_HOST} www.phpr.org [nc]
RewriteRule (.*) http://phpr.org/$1 [R=301,L]

Bir dizin yönlendirmek için de çok basit olarak tek bir satır ile yapabiliyoruz. Dikkat edilecek nokta dizini ne şekilde yönlendireceksiniz? Genel olarak kalıcı (301) ya da geçici (302) durumları kullanılır. Dahası için buraya bakabilirsiniz.

Eğer kalıcı yönlendirme (301) derseniz arama motorları girilen adresdeki indexleri yeni yönlenen adres ile değiştirir. Geçici derseniz herhangi bir değişiklik yapmadan yönlenen adrese girer ve tarar.

RewriteEngine On
RewriteRule ^eski_adres$ /yeni_adres [R=301,L]

Hata sayfalarını yönlendirme

Hata sayfalarının durum kodlarını öğrenmek için şuraya bakabilirsiniz. Bunlardan en yaygın olarak bildiğimiz; 404 kodlu sayfa bulunamadı, bir diğer örnek olarak da 403 kodlu giriş izni olmayan sayfa hatasıdır.

Dikkat etmeniz gereken nokta; yukarıda SEO ve kullanıcı dostu bağlantılar oluşturma yönteminin temeli, olmayan sayfaları yani 404 kodlu sayfaları bizim belirli dosyamıza yönlendirme olduğu için o yöntemi kullanırken bu aşağıdaki kodlar ile 404 sayfası tanımlamaya çalışmak faydasız olacaktır.

ErrorDocument 403 /izin_yok.html
ErrorDocument 404 /bulunamadi.html

Belirli IP adresine izin verme/engelleme

Tüm bir siteyi olduğu gibi isterseniz sadece belirli klasörlere göre de IP erişim engeli koyabilirsiniz. Bunu yapmak için hazırladığınız “.htaccess” dosyasını ilgili alt klasörün içerisine koymanız yeterli.

deny from all #herkesin girmesini engelle
allow from 127.0.0.1 #bu ip adresine izin ver
allow from 192.168.0.0/255 #ya da bu ip blokunun girmesine izin ver

Ayrıca sadece “deny from all” diyerek kullanıcılar tarafından erişimini tamamen engelleyebilirsiniz.

Bazı bot ve web servislerinin erişimini engellemek

İstemediğiniz ya da sitenizde aşırı dolaşıp yoran botları basit bir htaccess hamlesiyle engelleyip sunucunuzu rahatlatabilirsiniz.

Şu adreste genel olarak mimlenmiş kötü amaçlı olduğu düşünülen tüm botların bu yöntem için olan listesini bulabilirsiniz. Ben örnek amaçlı bir kaç tanesini yazacağım.

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Wget [OR]
RewriteCond %{HTTP_USER_AGENT} ^Widow [OR]
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule .* - [F]

Ayrıca bu yöntem ile mobilden giren kişileri de algılayıp mobil sitenize yönlendirilmesinde de kullanabilirsiniz.

RewriteCond %{REQUEST_URI} !^/mobil_dizin/.*$
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
RewriteRule ^(.*)$ /mobil_dizin/ [L,R=302]

Özel dizinleri şifrelemek

Bu yöntem için öncelikle basit bir şifre dosyası oluşturmamız gerekiyor. Dosyanın içerisine her satıra bir kullanıcı ekleyebiliyoruz. Ve her satırda “isim:şifre” şeklinde kullanıcı adı ve şifreleri tanımlıyoruz.

Şifre dosyamızın adını .htpasswd yapıp .htaccess dosyamızda belirteceğmiz bir yere yerleştiriyoruz. Sonrasında bu bilgiler ile şifrelemek istediğimizin dizinin içerisine aşağıdakileri yazıyoruz.

AuthUserFile /dosya/dizini/.htpasswd
AuthType Basic
AuthName "Gizli Dizin"

İçeriklerin başka sitelerde kullanılmasını engellemek

Hotlink adıyla bilinen bu yöntem sayesinde sitenizde olan müzik, resim, video gibi içeriklerin başka sitelerde gösterilip, oynatılmasını engellemenizi sağlıyor. Bu sayede sunucunuzun bant genişliğinin başka siteler üzerinden harcanmasına engel oluyorsunuz.

Bu yöntemde başka siteden bizdeki bir resim görüntülenmek istendiğinde ona istenilen resim yerine bir hotlink uyarı resmi gösterebiliyoruz. Bunun çokça örneğini imageshack.us’da görmüşsünüzdür.

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://([-a-z0-9]+.)?phpr.org[NC]
RewriteRule .*.(zip|mp3|avi|wmv|mpg|mpeg)$ //www.phpr.org/hotlink.jpg [R,NC,L]

Dikkat edilmesi gereken bazı detaylar

Farkettiyseniz yukarıda gösterdiğim yöntemlerin neredeyse hepsinde ilk “RewriteEngine on” komutu var. Eğer bu yöntemlerden bir kaçını birlikte kullanacaksanız tekrar tekrar bu satırı eklemenize gerek yok. Bunu sadece htaccess dosyanızın en başında bir kere yazmanız yeterlidir.

Diğer önemli husulardan birisi de birden fazla komut kullanırken işlemlerin sıralamasının öneminin olduğunu unutmayın. Yani eğer ilk önce 404 hata sayfası uyarı komutunu yazıp, alt satırına SEO dostu bağlantı komutlarını yazarsanız, önce 404 hata sayfa komutu tetiklenip ilgili yere gideceği için SEO dostu bağlantı yöntemi çalışmaz.

Parantez içlerinde kullanılan NC, L ve R harflerinin anlamları:

  • L: Last
    Bu tanımlanmadan önce ifade edilen kurallar bundan sonrakilere geçmemesini ve karışmamasını sağlar.
  • R: Redirect
    Bu değer kullanılırsa browserda adres değişir, kullanılmazsa yönlendirme arkaplanda yapılır fakat kullanıcının girdiği URL aynı kalır.
  • NC: No Case
    Büyük küçük harfe duyarsız davranır.
  • QSA: Query String Append
    GET metodu ile yönlendirme yaptığımızda yönlendirilen yere sonuna eklenen  GET parametrelerini de dahil eder.

Diğer tüm ifadeler için buraya bakabilirsiniz.

Bir başka faydalı PHP serüveninde görüşmek üzere esen kalın!

Etiketler:

Yazılanlar ilgini çektiyse, yenilerinden haberdar olmak için e-mail bültenine abone olabilirsin.

"PHP htaccess kullanımı" yazısı için 129 yorum yapılmış.

  1. Fırat Abak dedi ki:

    Merhaba gerçekten çok detaylı ve çok güzel bir yazı dizisi olmuş, .htacces ile ilgili sıkıntılarda yönlendirebileceğim bir makale olmuş.

  2. Sinan Yorulmaz dedi ki:

    Gerçekten muhteşem bir makale olmuş Musa, eline sağlık.

  3. Zafer LATİF dedi ki:

    Merhabalar. SEO ve kullanıcı dostu bağlantılar oluşturma , konusundaki , linkleri gizleme yani;

    http://site.nett/klasor1/klasor2/index.php?sayfa=iletisim

    olayını

    http://site.nett/klasor1/klasor2/iletisim

    yapamdım. Hiç bir şekilde olmuyor. Yardımcı olursanız sevinirim. Teşekkürler.

  4. M.Ali dedi ki:

    Sitemde güncellemeye gittim. Sef link denilen seoya uygun link tarzı yapmaya çalıştım.

    Sorunum .htaccess de eski olan değerli sayfalarımı yeni sayfalara yönlendirmek. htaccess dosyasında yaptığım yönlendirme şekli şu:
    Options +FollowSymLinks
    RewriteEngine on
    RewriteBase /

    RewriteRule ^index.php?sayfa=servis&id=57$ /servis-guncel-iletisim [L,R=301]

    gibi. Fakat sayfada bu şekilde yapılan yönlendirme kabul olmuyor.

    Yönlendirmeyi sayfa=servis&id=57$ / servis-guncel-iletisim olarak yaparsam oluyor. Fakat başına index.php? koyarsam olmuyor. Bu şekilde çok sayfam var ve sayfa değerlerini kaybetmek istemiyorum. 3011 yönlendirmesi yapıp sayfaya gelen linkleri çalıştırmam lazım.

    Yardım ederseniz gerçekten müteşekkir olurum. Kolay gelsin..

    • Musa Avcı dedi ki:

      bunun için iki kural girmemiz gerekiyor. birincisi eski linkleri yeni linke yönlendirecek, diğeri ise yeni link yapısının açacağı sayfayı belirlemek.

      Options +FollowSymLinks
      RewriteEngine on
      RewriteBase /
      
      RewriteRule ^index.php?sayfa=servis&amp;id=57$ /servis-guncel-iletisim [L,R=301]
      RewriteRule ^/servis-guncel-iletisim$ index.php?sayfa=servis&amp;id=57 [L]
      

      ikincisi link yönlendirmesi değil, sunucu tarafında bir yönlendirme. bu yüzden ikincisine “R=301” eklemedik.

      • M.Ali dedi ki:

        hemen deneyceğim. Eğer olursa o kadar yere yazdım bir tane doğru cevap gelemedi. İlgin için çok teşekkür ederim.

  5. M.Ali dedi ki:

    Malesef olmadı. Yönlendirme kuralını htaccess dosyasına şu şekilde yazmıştım. RewriteRule ^servis-(.*)$ index.php?sayfa=servis&adres=$1 [L]
    yani başına “servis-” gelen adresleri yönlendirme yaparak link sistemini oluşturdum. databasede adres diye sütun açtım ve oradan elimle girdiğim adresleri çağırttırdım.
    Önceki link bağlantımda http://www.site.com/index.php?sayfa=servis&id=57 olan adresimi http://www.site.com/servis-guncel-iletisim sayfasına r301 ile yönlendirmek istiyorum. İlk mesajda yazdığım gibi sayfa=servis&id=57$ olarak linki yazarsam yani başına index.php koymadan yazarsam http://site.com/sayfa=servis&id=57 yazıp siteye girersem r301 yönlendirmesi oluyor ve istediğim sayfaya gidiyorum. http://site.com/index.php?sayfa=servis&id=57 olarak yazdığımda 301 yönlendirmesi çalışmıyor ve eski sayfaya ulaşmaya çalışıyor. Sie nasıl ulaşabilirim ayrıca? isterseniz kullanıcı adımdaki mail adresine iletişim bilgilerinizi mail atabilirsiniz. yinede ilginiz için teşekkür derim şimdiden.

    • Musa Avcı dedi ki:

      tamam şimdi anladım. index.php’ye direkt girişleri yeni linklere yönlendirme işlemini htaccess ile değil de index.php içinden php kodu ile yapmamız gerekiyor. orada htaccess yönlendirmesi yapmamız yanlış olmuş.

      yapman gereken htaccess dosyası ile “/servis-iletisim” diye girildiğinde “index.php?sayfa=servis&adres=$1&sef=1” dosyasına yönlendirmek. farkettiysen sonuna sef=1 ekledim. eğer bu değer yoksa kişi kendisi girmiştir ve onu sen php ile “/servis-iletisim” adresine yönlendirmelisin.

      htaccess dosyasını ise şöyle yap:

      Options +FollowSymLinks
      RewriteEngine on
      RewriteBase /
      
      RewriteRule ^servis-(.*)$ index.php?sayfa=servis&amp;adres=$1&amp;sef=1 [L]
      
  6. M.Ali dedi ki:

    Musa Bey bilgiler için teşekkür ederim. Fakat htacces üzerinden yönlendirirsem sayfa değerleri korunur kalacak. Toplasan böyle 10 adet sayfa var ve bunları .htaccess üzerinden yönlendirme yaparsam sayfa kaliteleri devam edecek. dediğinizde deneyeceğim fakat .htaccess üzerinden yönlendirme yapmanın bir yolu yok mu?

    • Musa Avcı dedi ki:

      index.php girenleri php kodu ile yönlendirmenin bir sakıncası yok. ama ille de bunu da htaccess ile yapmak istiyorum diyorsanız:

      Options +FollowSymLinks
      RewriteEngine on
      RewriteBase /
       
      RewriteRule ^servis-(.*)$ index.php?sayfa=servis&amp;adres=$1&amp;sef=1 [L]
      
      RewriteCond %{QUERY_STRING} ^sayfa=servis&amp;adres=(.*)$
      RewriteCond %{QUERY_STRING} !sef=1
      RewriteRule ^index.php$  /servis-%1? [R=301,L]
      
  7. M.Ali dedi ki:

    bu şekilde yazdığım zaman ayrıca 301 yönlendirilecek sayfayıda yazmam lazım mı? veya bu kodları yazdıktan sonra http://www.site.com/index.php?sayfa=servis&id=57 diye tıklanan bir link otomatikman yönlendirilecek mi?

    • Musa Avcı dedi ki:

      en son gönderdiğim htaccess içeriğini kullandığında php tarafında bir şey yazmana gerek yok. bana yukarıda gösterdiğin link örneğine göre “index.php?sayfa=servis&adres=iletisim” diye girlince “/servis-iletisim” adresine yönlendireceğini görürsün.

  8. M.Ali dedi ki:

    sizinle mail adresim üzerinden iletişim kurabilir miyiz? Dediğiniz gibi oldu. Aslında her adres satırı için otomatik bir çözüme ulaştırdınız ama istediğim olmadı. Yardımlarınız için Allah sizden razı olsun. Sıkıntı şu önceki adres sistemi id li olduğu için siteye http://www.site.com/index.php?sayfa=servis&id=57 tıklayan kişi için geçerli değil. Fakat oluşturduğunuz kod sistemi http://www.site.com/iindex.php?sayfa=servis&adres=iletisim yazarsa dediğiniz gibi çok güzel oluyor. Fakat id ile yazıldığı zaman gitmiyor. Mail adresimi açıktan yazmama gerek var mı? kullanıcı bilgilerimde var.

    • Musa Avcı dedi ki:

      id’li olanı php ile olması gereken link adresini veritabanından çekip yeni link yapısına header kodu ile 301 yönlendirin. yani kullanıcı index.php?sayfa=servis&id=57 dediğinde hemen ilk satırlarda 57 id’li servis sayfasının adresini buldurup “/serivis-iletisim” şeklinde o sayfaya yönlendirin.

      • M.Ali dedi ki:

        🙂 Keşke o kadar php bilgim olsaydı. Kolaysa nasıl yapılacağına dair bir örnek verebilir misiniz? Kullandığım sistemde php de sayfa seçimini şöyle yapılıyor örnek olarak.

         $sayfaal = mysql_query(&quot;SELECT * FROM sayfa WHERE adres = '$_GET[adres]'&quot;);
        $sayfa = mysql_fetch_array($sayfaal);
        $busayfa= $sayfa['id'];
        if ($dosya==&quot;sayfa.php&quot;){
        $sbasal = mysql_query(&quot;SELECT * FROM sayfa WHERE id = $busayfa&quot;);
        $sbas = mysql_fetch_array($sbasal);
        $title= &quot;$sbas[title]&quot;;
        $desc=&quot;$sbas[dess]&quot;;
        $keyw=&quot;$sbas[keyw]&quot;;

        Bu sistemde nasıl bir yol izleyebilirim? eğer zor bir durumsa bi şekilde halletmenin yolunu bulmaya çalışacağım.

  9. Bülent Sakarya dedi ki:
    # Sayfalar İçin SEO Dostu URL Yapısı
    ReWriteRule ^(.*)-(.*).html /hk21/page.php?id=$2&amp;bla=$1 [L]
    # Yazılar İçin SEO Dostu URL Yapısı
    ReWriteRule ^(.*)-(.*).html /hk21/post.php?id=$2&amp;bla=$1 [L]
    # Yazı Kategorileri İçin SEO Dostu URL Yapısı
    ReWriteRule ^(.*)-(.*).html /hk21/posts.php?id=$2&amp;bla=$1 [L]
    # Ürün İçin SEO Dostu URL Yapısı
    ReWriteRule ^(.*)-(.*).html /hk21/product.php?id=$2&amp;bla=$1 [L]
    # Ürün Kategorileri İçin SEO Dostu URL Yapısı
    ReWriteRule ^(.*)-(.*).html /hk21/products.php?id=$2&amp;bla=$1 [L]
    # Marka İçin SEO Dostu URL Yapısı
    ReWriteRule ^(.*)-(.*).html /hk21/brands.php?id=$2&amp;bla=$1 [L]
    # Albüm Resimleri İçin SEO Dostu URL Yapısı
    ReWriteRule ^(.*)-(.*).html /hk21/gallery.php?id=$2&amp;bla=$1 [L]
    

    Yukarıda ki gibi bir yapı oluşturdum ama hep page.php değerinde ki kural işliyor. örneğin id’si 1 olan sayfa, yazı, ürün kategorisi, marka ve albüm var. bunlara tıkladığımda hep id’si 1 olan sayfayı açıyor. sayfa id’si ile aynı id’ye sahip diğer bölümlerde de içerik varsa hep sayfa id değerini işliyor.

    çözemedim bir türlü neyi eksik yapıyorum…

    • Musa Avcı dedi ki:

      htaccess’de sıralama önemli. yani yukarıdan aşağıya doğru işlenir komutlar. eğer ilk komuttaki koşul uygun olursa yönlendirmeyi yapar.

      sizin attığınız kodda her satırdaki komutu koşulu aynı ve doğal olarak ilk sıradaki çalışınca diğerlerine inmiyor.

      öncelikle her satırda farklı bir koşul ifade etmelisiniz, bu sayede sunucu sırayla gidip en uygun olanında durur. bunun için mantıklı ufak bir örnek vermek gerekirse:

      # Sayfalar için
      ReWriteRule ^sayfa/(.*)-(.*).html /hk21/page.php?id=$2&amp;bla=$1 [L]
      # Yazılar için
      ReWriteRule ^yazi/(.*)-(.*).html /hk21/post.php?id=$2&amp;bla=$1 [L]
      

      bu şekilde yaptığınızda, girilen sayfa eğer “/yazi/123-abc.html” şeklinde ise ilk komutu es geçip ikincisinde yönlendirecektir. çünkü ilkinde ilk bölümün “sayfa” olmasını ifade ettik.

      umarım anlatabilmişimdir, ayrıca bu konuyla alakalı olarak bu yazıdaki “SEO ve kullanıcı dostu bağlantılar oluşturma” başlığını tekrar incelemenizi öneriyorum.

      mutlu kodlamalar.

      • alper dedi ki:

        Peki urlleri olabildiğinde kısa tutmak istersek nası yapacağız bunu script içerisinde. Örnek:
        domain.com/kategori.html
        domain.com/urun.html
        domain.com/konu.html
        gibi.

        Ayrıca index.php?islem=kategori&adi=kategori-adi
        gibi bir linkleme ile.

  10. Merhabalar hocam.
    benim kendi yaptığım blog scriptinde url olayı mesela bir yazı okuyacak isek devamını oku linki
    oku.php?id=$id
    şeklinde
    ve db bilgileri ise

    $query_blogum = &quot;SELECT * FROM blogum ORDER BY id DESC&quot;;
    $blogum = mysql_query($query_blogum, $ok_kisisel) or die(mysql_error());
    $row_blogum = mysql_fetch_assoc($blogum);
    $totalRows_blogum = mysql_num_rows($blogum);

    Ben bunlara göre sef url nasıl yaparım.

    yani

    http://site.com/yazi-basligi

    • Musa Avcı dedi ki:

      eğer normal yapın id’sine göre bulmaksa şuanki hali ile /yazi-basligi şeklinde ulaşamazsın. /123/yazi-basligi şeklinde yapabilirsin.

      ya da özellikle sadece yazı başlığı olsun istiyorsan bunun için öncelikle başlığa göre bulan bir oku.php ayarlaman gerekiyor. yani oku.php?sef=yazi-basligi sonrasında htaccess ile /yazi-basligi diye gireni oku.php?sef=yazi-basligi adresine yönlendireceksin.

  11. Ahmet dedi ki:

    harbiden adamın dibisin Musa 🙂 mvc çalışıyodum daha evvel gördüm ama inceleme fırsatım olmadı kısmet bu güneymiş 🙂 saolasın

  12. mustafa fehmi dedi ki:

    merhaba musa avcı
    benim şöyle linklerim var bir tanesini yazıyorum
    Şifremi unuttum gördüğünüz gibi http://www.siteadım.com/index.php?sayfa=sifretalep sayfam var ve ben bunu .htaccess ile http://www.siteadım.com/sifretalep yapmaya çalışıyorum iki haftadır ama yapamıyorum yardım ederseniz çok sevinirim 2 haftadır yapamadım aklım gidiyor. Şimdiden teşekkürler

    • Musa Avcı dedi ki:

      merhabalar, aşağıdaki htaccess kodu işinizi görmesi gerekiyor;

      Options +FollowSymLinks
      RewriteEngine on
      RewriteBase /
        
      RewriteRule ^sifretalep$ index.php?sayfa=sifretalep [L]
      

      daha iyi anlamak için yazıdaki ve yorumlardaki örnekleri inceleyip denemenizi öneririm.

  13. mustafa fehmi dedi ki:

    linklerim ise şu şekilde < a href="sifretalep" linklere yanlış şeyler mi yazıyorum

  14. mustafa fehmi dedi ki:

    Yukardaki cevabın, yardımın ve ilgin için çok teşekkürler. Musa ben senin dediğini yaptım fakat elimde en az 30 url var. Hepsi için tek tek yukardaki gibi mi yapacağım. Mesela bende şöyle bir url var ; siteadım.net/index.php?Git=üyekayıt&sayfa=üyeol ; gördüğün gibi en az 30 tane böyle url var benim üyekayıt bir kasör. o klasörün içinde de index.php dosyam var çoğu işlemi orda yapıyorum.
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?Git=$1&sayfa=$1 [QSA,L]
    yanılmıyorsam bu genel kodlar fakat bende çalışmıyor ne yapmalıyım.

  15. mustafa fehmi dedi ki:

    yani benim istediğim ise şu siteadım.net/üyekayıt/üyeol şeklinde gözükmesi ilgin için tekrar teşekkür ederim

  16. mustafa fehmi dedi ki:

    musa peki link kısmına nasıl yazayım yani a href kısmına <a href="üyekayıt/üyeol" şeklinde mi yazacağım . Denedim çalışmıyor link kısmına nasıl yazacağımı bilmiyorum

    • Musa Avcı dedi ki:

      evet; “/uyekayit/uyeol” şeklinde girmeye çalıştığınızda “index.php?Git=uyekayit&sayfa=uyeol” olarak yönlendirmesi gerekiyor.

  17. mustafa fehmi dedi ki:

    The requested URL /sidebar/Java was not found on this server. bu hatayı alıyorum . şimdi sana tam olarak anlatayım benim bir linkim var localhost/index.php?Git=sidebar&sayfa=Java ben senin dediğin gibi /sidebar/Java şekline soktum htaccessi de dediğin gibi yaptım şöyle
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/(.*)$ index.php?Git=$1&sayfa=$2 [QSA,L]
    sidebar klasöründe index.php sayfası yaptım içerisinde $sayfa=kodtemizle($_GET[“sayfa”]);
    switch($sayfa)
    {
    case “Java”:java();break;
    }
    kodlarım var. Fakat dediğim gibi yukardaki gibi The requested URL /sidebar/Java was not found on this server. böyle bir sayfa yok hatası aldım

  18. mustafa fehmi dedi ki:

    çalışıyor musa çünkü ben linkimi şöyle yaptığımda <a href= "gonder" ve
    htaccess içine şu kodu yazdığımda çalışıyor
    RewriteRule ^gonder$ index.php?Git=uyehesabi&sayfa=sifregonder [QSA,L]
    adres çubuğunda şöyle görünüyor bu çalıştığını göstermez mi ?
    localhost/gonder şeklinde bir url veriyor

  19. mustafa fehmi dedi ki:

    ne diyorsun sence neden 404 hatası alıyorum ? sitede dosyalarımın klasörlerimin kodlarımın bulundukları kısımları resimlerini sana göndereyim mi ne nerde diye?

  20. Faruk dedi ki:

    Önemli bir sitemde sistem değişikliği yaptığım için eski uzun karışık urlyi yeni bir url ye yönlendirmem lazım. Çok fazla sayıda içerik olduğu için bunu elle yapmak çok zahmetli olacak.

    Sizden ricam bu konuda verdiğim urlerle yardımcı olmanız. Gelen eski urldeki değişken kelime yeni url de eklenerek yönlendirilecek.

    Eski URL : sonuclar/0.html?pattern=DEĞİŞKEN KELİME&rpp=0&sort=0

    Yeni URL : bilesen/arama/?searchword=DEĞİŞKEN KELİME&ordering=newest&searchphrase=all&limit=10&a rea s[0]=media

  21. ali dedi ki:

    Teşekkürler.Güzel açıklamalar.

  22. Demir dedi ki:

    Merhaba hocam, öncelikle htaccess ile ilgili bu nacizane bilgiler için teşekkür ederim. Yalnız benim sormak istediğim bir konu var. Örneğin herhangi bir siteden gelen referans linklerin parametre değerlerini almamız mümkünmüdür htaccess ile ? bunu normalde php scriptinde yapabiliyorum ama kolay yoldan yani sorgu yazmadan htaccess ile yapmanın bir yolu varmı? Biraz araştırdım ama sonuca pek ulaşamadım.

    Örnek verecek olursak http://www.refsitesi.com/url?tip=23&giden=true&oy=3&url=benimsitem.com/makale-adi.html

    bu siteden gelen değişkenler yani oy ve url değişkenlerinin değerlerini almak istiyorm. Bunu nasıl yapabiliriz hocam?

    aşağıda araştırdığım ve edindiğim bilgilere göre bu değerler kullanılıyor ama

    RewriteCond %{HTTP_REFERER} .*refsitesi.*$
    RewriteCond %{QUERY_STRING} ^*url=.*$

    pek çözemedim hocam

    • Musa Avcı dedi ki:

      isterseniz bu olayı PHP ile daha rahat yapailirsiniz. $_SERVER[‘HTTP_REFERER’] değişkenini kullanarak sayfaya nereden gelindiğini alıp PHP ile daha rahat parçalara bölüp (regexp, explode, vs.) istediğiniz sonuca ulaşabilirsiniz.

  23. Doğancan Tat dedi ki:

    İlköncelikle Merhaba , yazdığınız makale gerçekten çok iyi olmuş tebrik ederim. Fakat benim yaptığım bir deneme bir sorun oluştu. Bu sorunu aşağıdaki linkte görebilirsiniz..
    http://www.dogancantat.com/hata.png
    Konudaki verileri dahil herşeyi çekiyorum fakat CSS dosyası sanırım çöktü. Bir türlü düzeltemedim. Yardımcı olursanız sevinirim. İyi çalışmalar..

  24. Mazlum Ağar dedi ki:

    Hocam çok güzel yazı tebrik ederim.Ama ben
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ sayfa.php?sayfa=$1 [QSA,L]

    Bunu kullanmak istedim.Ama şu şekilde bir sıkıntı ile karşılaşıyorum.Örneğin http://www.deneme.com/ilan/ilan-ekle sayfasına gittim.Bundan hemen sonra /ev sayfasına gitmeyi bir butona atadığım zaman benim istedigim http://www.deneme.com/ev‘e gitmesi ama o http://www.deneme.com/ilan/ev ‘e gidiyor.Bu şekilde bir hata ile karşılaştım nasıl halledebilirim.Teşekkür ederim

  25. Ahmet Pekin dedi ki:

    Makale süper elinize sağlık Musa bey. Birşey sormak istiyordum benim linkim bu şekilde
    http://www.site.net/makale_oku.php?id=1&sef=cok-komik-bir-video
    fakat ben bunun başına birde hangi kategori ise onuda yazdırmak istiyorum yani istediğim link tipi şu
    http://www.site.net/komik/1-cok-komik-bir-video.html
    Veritabanından kategoriyi falan da çektim linki yukarıdaki gibi hazırladım onda sorun yok ama .htaccess kısmının içinden çıkamadım.
    Yardımcı olursanız minnettar olurum. Çalışmalarınızda başarılar..

  26. Fevzi dedi ki:

    Anlatım çok güzel olmuş emeğinize sağlık

  27. Hikmet dedi ki:

    Anlatım süper ama ben şunu çözemedim.

    “.$baslik.” linkim böyle htaccess ise RewriteRule ^(.*)-(.*)/$ ayrinti.php?baslik=$1&id=$2 [L,NC] böyle her iki dosyamda ana dizinde www klasöründe ayrinti.php ise if(!isset($_GET[“baslik”]) || !isset($_GET[“id”])){

    echo”Link yok”;
    }else{
    $id = $_GET[“id”];
    echo “secici: “.$_GET[‘id’].””;
    $sor2 = mysql_fetch_array(mysql_query(“SELECT * FROM ilanlar WHERE baslik=’$baslik’ AND id=’$id'”));
    bunu bir türlü çözemedim

  28. Mustafa Tevfik dedi ki:

    Merhabalar, öncelikle bu güzel paylaşımınızdan ötürü teşekkür ederim.. Benim de bir sorunum var..

    Notlar klasörü içerisinde.. index.php, notlar.php ve detay.php olmak üzere 3 dosyam mevcut.. Bunların notlar ve detay kısımlarının seolu olmasını istiyorum..
    Yani index’ten gelen birisi oradaki linke tıkladığında (kategori1.html) şeklinde notlar.php sayfası açılsın isitoyrum.. Notlar sayfasından da bir linke tıklanınca (odev1.html) şeklinde gözükmesini istiyorum.. Bunu nasıl yapabilirim yardımcı olursanız çok sevinirim..

    Bu şekilde yazınca sadece detay kısmı çalışıyor.
    Options +FollowSymLinks
    RewriteEngine on

    ReWriteRule ^notlar/(.*?)-(.*?).html$ notlar/detay.php?id=$1
    ReWriteRule ^notlar/(.*?)-(.*?).html$ notlar/notlar.php?id=$1

  29. Yüksel Acı dedi ki:

    RewriteEngine On
    ReWriteRule ^(.*)-(.*).html hizmetler.php?grup_id=$2 [L,NC]
    ReWriteRule ^(.*)-(.*).html hizmetdetay.php?urun_id=$2 [L,NC]

    birinci sırada yazan için link şekilleniyor fakat ikinci sıradaki işlemde yanlışlık oluyor, şöyle ki, ikinci linkin id numarasını doğru alırken içerik olarak birinci linkin içeriğini getiriyor hatayı nerde yapıyorum acaba.

  30. Internal Server Error

    The server encountered an internal error or misconfiguration and was unable to complete your request.

    Please contact the server administrator, admin@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

    More information about this error may be available in the server error log.

    klasöre .htaccess oluşturdum ve yukarıdaki hatayı aldım neden acaba

  31. Edel Ajans dedi ki:

    Arkadaş benım bir sıkıntım httacess ben yazdiğim bütün css js ve resimler etkilenıyor. bunun etkilenmemesi için ne yapmam gerek

    • Musa Avcı dedi ki:
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d

      htaccess kuralları tanımlarken varolan dosya ve dizinlere müdahale etmemek için yukarıda yazdığım iki koşulu eklemeniz gerekiyor. Örnek kullanımı da yine yazının içerisinde mevcut.

  32. Adem dedi ki:

    Bu konuda o kadar çok site dolaştımki sonunda aradığımı buldum. Elinize, emeğinize sağlık.

  33. Şahin dedi ki:

    Bir klasörün tamamına ve alt dizinine kullanıcı adı ve şifre ile erişim için htaccess ile active directoryde kayıtlı bir kişinin kullanıcı adı ve şifresi ile giriş yapmasını istiyorum.kullanıcı adı ve şifre girildikten sonra yine kullanıcı adı ve şifre ekranı geliyor sorun ne çözemedim.ldap kontrolünü php ile yapabiliyorum ama htaccess te sıkıntı var.yardımcı olursanız sevinirim.

    AuthType Basic
    AuthBasicProvider ldap
    AuthName “Giris için Kullanici Bilgileri ile giris yapabilirsiniz.”
    AuthzLdapAuthoritative off
    AuthLdapUrl “ldap://test.com:389/DC=test,DC=com?sAMAccountName?sub?(objectClass=*)” NONE
    AuthLDAPBindDN “[email protected]
    AuthLDAPBindPassword “deneme”

    require valid-user

    php testi çalışıyor.

    $ldaphost = “test.com”;
    $ldapport = 389;

    $ds = ldap_connect($ldaphost, $ldapport)
    or die(“Could not connect to $ldaphost”);

    if ($ds)
    {
    $username = “[email protected]”;
    $upasswd = “deneme”;

    $ldapbind = ldap_bind($ds, $username, $upasswd);

    if ($ldapbind)
    {print “Congratulations! $username is authenticated.”;}
    else
    {print “Nice try, kid. Better luck next time!”;}
    }

  34. Hakan dedi ki:

    .htaccess içinde, tüm sayfalarda kullanabileceğimiz sabit değer barındırabilir miyim? Mesela MOBIL_URL yazdığım yer yerde “site.com/mobil_url” değerini versin. Böyle bişey mümkün müdür?

  35. Halil dedi ki:

    Merhabalar ,
    Sitemde ufak bir etiket sistemi yaptım. Etiketlere tıkladığında get ile etiket.php sayfasında sorguluyor. .htaacces ile bunun maskelemesinide yaptım. Örneğin deneme etiketine tıkladığında etiket/deneme diye sonuç veriyor ve sayfa görüntülenebiliyor. Ancak etiketimiz deneme-yazisi gibi arası – olursa sayfa 404 veriyor.

    RewriteRule (.*)etiket/([0-9a-zA-Z]+)(/?)$ etiket.php?etiket=$2 [L,NC]
    .htaccess dosyamın içeriği bu şekilde. Yardımcı olabilir misiniz ?

    • Musa Avcı dedi ki:

      Kuralınızın içerisinde “[0-9a-zA-Z]” diyerek; 0 ile 9 arası ve A’dan Z’ye harfleri ifade etmişsiniz. Yani “-” işareti bu ifadede yer almıyor. Bunun için bu ifadenin içerisine kaçış karakteri ile “-” eklemeniz gerekiyor. Yani şöyle olması lazım;

      RewriteRule (.*)etiket/([0-9a-zA-Z-]+)(/?)$ etiket.php?etiket=$2 [L,NC]
      
  36. Azeri dedi ki:

    Selam.
    Ben htaccess ile nasil yapa bilirim kullanicilar php isimlerini goremesin.
    php isimleri farkli mesela: menu.php , fight.php , online.php ve s.

  37. Zeyd Özer dedi ki:

    “Bildiklerini Anlatan” sitede senin bildiklerini anlatmışlar 🙂
    http://www.bildiklerim.net/bildiklerimiz/php-htaccess-kullanimi/

  38. pix-L dedi ki:

    eline saglık güzel olmuş hocam

  39. Hakan dedi ki:

    Merhaba hocam bende anlatımınıza bakarak çok uğraştığım bir konuda yardım rica edicektim.

    wp anadizininde kendi oluşturduğum bir dosya var(oku.php).Örnekliyeyim

    Yazı içerisine siteismi.com/oku.php?id=5 diye link veriyorum.Buna tıklanınca id’si 5 olan yazının özel alanlarını çekerek farklı bir sayfa oluşturdum.Çalışmada sorun yok.Ben htaccess dosyasına nasıl bir ekleme yaparak siteismi.com/yaziismi/oku gibi çalışmasını sağlayabilirim?

    htaccess dosyasında kalıcı bağlantılar kısmından eklediğim kodlarda mevcut.Yardımcı olursanız duacınız olurum.

  40. ilhami dedi ki:

    Selam Musa
    seo linkinden sonra sepete ekle linki çalışmadı
    “nicon-t34.html?action=ekle&sid=34” şeklinde fakat sepete eklemiyor, urun-detay.php?action=ekle&sid=34 yazınca ekliyor
    nerde yanlış yapıyorum yardımcı ola bilirmisin
    e-ticaret için hazırladığım
    htaccess dosyasının içeriği şöyle:
    DirectoryIndex index.php
    Options +FollowSymLinks
    RewriteEngine on
    RewriteRule ^(.*)-t([0-9]*).html$ urun-detay.php?t=$2 [L,NC]

    RewriteRule ^([0-9]+)-urun-kategorileri-(.*).html$ urun-kategorileri.php?katid=$1 [L,NC]

    RewriteRule ^(.*).html$ $1.php [L,NC]

    urun-detay.php sayfasında sepete ekle linki şöyle:
    SEPETE EKLE

    ve action içeriği :
    if($_GET[‘action’]==”ekle”){
    if(in_array($_GET[‘sid’], $sepet)){
    if($adet[$key]<10)$adet[$key]++;
    }else{
    array_push($sepet,$_GET['sid']);
    array_push($adet,1);
    }
    header("Refresh: 1; url=sepet.php");

  41. Carlito dedi ki:

    Merhaba, benim şöyle bir sorunum var. Butonlara linkleri index.php?page=sayfaadi şeklinde veriyorum, ve index.php sayfasındada get metodu ile gelen değer eğer sayfaadi şuysa bu içeriği göster şeklinde koşullar yazıyorum, htacces dosyasıda anlatılanlar şeklinde yaptım ama linklere tıklayınca yine index.php?page=sayfaadi şeklinde gözüküyor. Acaba linkleri ne şekilde vermem gerekir? Link verirken hatalımı veriyorum?

  42. Mahmut Özben dedi ki:

    .htacces gayet başarılı şekilde çalışıyor. Anadizinde .htaccess dosyası var ve bir site var. anadizin/klasör/klasör konumunda ayrı bir site var, .htaccess anadizin/klasör konumuna etki etmesin istiyorsam ne yapmam gerek ?

  43. Windofelm dedi ki:

    Emeğinize sağlık güzel paylaşım ..

  44. Ali Hasan Yılan dedi ki:

    peki 2.domain olarak yönlendirmeyi cpanel’den yaptım fakat anadomain’deki bir altklasör’de 2.domain’in linkleri değişmeden kullanmak istiyorum bunu nasıl yapabilirim acaba?

    ReWriteCond %{HTTP_HOST} ^(www.)?domain2.com$ [NC]
    ReWriteRule ^(.*)$ /altklasor/$1 [L]

    yapıyorum çalışmıyor.

  45. emrullah dedi ki:

    Merhaba hocam bir sorum olacaktı. Yönlendirme yapınca websitemiz
    .css .js gibi dosyaların yolunu bulamaz oldu. Ör: site.com/kategori/katismi <== gibi olunca tasarım ve jquery elemanları çalışmıyor. Fakat; site.com/kategori.php?kat=katismi gibi olunca sorun yok. Bu sorunu nasıl çözeceğiz?

  46. mustafa dedi ki:

    RewriteEngine On
    RewriteCond %{HTTP_HOST} localhost [nc]
    RewriteRule (.*) http://www.phpr.org/$1 [R=301,L]

    hocam bu kodu .htaccess dosyasına kopyaladım localhost diye değişiklik yaparak ama takıldı kaldı htaccess dosyasını siliyorum yine de sayfa yerine php.org açılıyor anlamadım gitti 🙁

    • mustafa dedi ki:

      çerezleri silince düzeldi, demekki bu url yönlendirme çereze kayıt yapıyormuş 🙂

  47. Furkan dedi ki:

    Hocam merhaba WordPress sitemde kalıcı bağlantılarda değişiklik yaptım sonun .html ekledim. Ama sorun var google indexlerinde .html olmadığı için sıralama alan konularıma biri tıklanyınca 404 sayfası çıkıyor bu aşabilme ihtimalimim varmı

  48. Mustafa dedi ki:

    Bir çok google arama sonucundan bu siteye geliyorum fakat bana lazım olan konuların hiçbiri sıfırdan ele alınmamış belki diğer konularda böyledir. O kadar aradım bu htaccess konusunu hiç bilmeyenler için bir ders bulamadım. Bu sitede bilgi var teşekkürler ama belli bir temeli olanlar için. Mesela index.php?pid=1 diye bir sayfam var bunu nasıl optimize edebilirim yukarıda 1 metreden fazla olan yazıda cevabı yok. Bu htaccess neyin konusu kendi başlı başına bir dil midir yok regex konusu mudur?. Yine de teşekkürler.

  49. Nurullah Gül dedi ki:

    Musa Bey 1 aydır aradığım sorunun cevabını konuda vermişssiniz ama çok denememe rağmen bir türlü doğru sonuca gidemedim.
    Benim Link şeklim şu şekilde index değilde tindex.php(httacces’buna yönlendirdim)
    tindex.php?url=anasayfa,tindex.php?url=iletisim gibi.
    “RewriteEngine On
    DirectoryIndex tindex.php?url=anasayfa
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ tindex.php?url=$1 [QSA,L] ”
    Çözüm olmadı bu kod yardımcı olursanız sevinirim

  50. Turker dedi ki:

    Merhaba hocam size ufak bir sorum olacaktı;

    ceb.im sistemini belki duymuşsunuzdur free wap sitesi veren bir servis bu sistemdeki gibi domainleri nasıl oluşturabilirsi?
    Örnek olarak phpr.ceb.im phpr.tr.nu gibi

  51. Ercan dedi ki:

    güzel mekale olmuş çok teşekurler

  52. Kral Oyun dedi ki:

    selamlar
    sitede url yapisi degistim.
    wp sitede
    /category/etiketismi
    seklindeki urller
    /etiketismi
    olarak kisaldi
    yalniz eski seklini yeni sekline yönlendirmek istiyorum
    bunu htaccess ile nasil yapabilirim ?
    tesekkürler

  53. sysdba dedi ki:

    netbeans de localde çalışan proje sunucuya atılınca adres satırında siteadi.com/Home şeklinde çıkıyor. bu Home nasıl kaldırılır. siteadi.com olarak görünmesi nasıl sağlanır?

  54. mami dedi ki:

    Merhabalar. Ben sitede seflink yaptım. Şöyle bir durum var

    http://www.siteadi.com/deneme/sayfa olarak yazınca giriyor.
    http://www.siteadi.com/deneme/sayfa.php yazınca da giriyor..
    Benim istediğim şey sonda .php yazınca bunu farklı yere yönlendirmek istiyorum. Yaptığım yöntem şu

    RewriteRule ^(.*).php$ hata.php [L,NC]
    Bunu yapınca seflinkte de aynı yönlendirmeyi yapıyor…

    Çözümü nedir?

  55. Oz dedi ki:

    merhaba.codeları yazmıssın ama mesle [L,NC] bunların matıgını ya da % niye koyuyoruz gibi anlatmamıssın.Mantıgını ögrenmessek bu yazdıklarının ötesinde birsey yazamayız.Sen kod yazım mantıgını bunun nereden ögrendin.Yani [L,NC] niye konulur ne zaman konulurlu nasul ogrendin

  56. Oz>an dedi ki:

    Yorum için çok özür dilerim sayfanın en sonuna apache baglantısı koymussun ve hatırlatma yapmıssın.ama keske sayfanın en ustune biraz hatırlatma yapsan,o zaman kodu daha iyi anlardık.Yani önce konuya ait parametreleri vermeden,örnege gecmek cok saglıklı degil.

  57. Serkan DURAK dedi ki:

    arkadaşlar google bot sitemin ana sayfasına ulaşamıyor. google yetkililerine sordum birkaç neden saydılar bunların içersinde .htaccess dosyası da mevcut… benim htaccess dosyam
    # BEGIN WordPress

    RewriteEngine On
    RewriteBase /
    RewriteRule ^index.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]

    # END WordPress
    önceden birkaç defa oynadım site bağlantıları tamamen gitmişti geri getirmek için uğraşmıştım. bu konuda bilgisi yüksek bir arkadaştan yardım bekliyorum şimdiden teşekkür ederim...

  58. Arkadaşlar merhaba. Sitemdeki dosyalar eksiksiz fakat anasayfa dışında hiç bir yere gidemiyorum.Bir iki kişi .htcaccess ile alakalı dedi ama nasıl yapacağımı anlatmadılar. Yardımcı olabilcek arkadaşlar mail atarsa sevinirim. Birde serverim windows. windows serverlerde .htcaccess komutlarının bazıları çalışmıyormuş bilgilerinize.

  59. Ercan Ka. dedi ki:

    Musa Bey, bilgilendirici yazılarınız ve sorulan sorulara açıklayıcı şekilde verdiğiniz yanıtlar için teşekkürlerimi sunmak istedim. İyi çalışmalar.

  60. dergi dedi ki:

    Paylaşımınız için teşekkürler, çok faydalı oldu. Kolay gelsin!

  61. root dedi ki:

    hocam güzelde işin kötü tarafı
    RewriteRule ^(.*)$ sayfa.php [L]

    örneğin bide iletisim.php olduğunu düşünün hangi php dosyasını açacağını nasıl söyleye biliriz

  62. ergün dedi ki:

    merhaba, oldukça güzel ve açıklayıcı bu yaznız için öncelikle size teşekkür ediyorum Benim merak ettiim bir konu var izin verirseniz onu size sormak istiyorum. wordpress tabanlı sitelerde seo dostu url yaptığımızda urldeki karakterler arasında – işareti yerine + işareti koyabilmemiz mümkünmüdür. eğer bu mümkünse nasıl yapılır. bu konuda yardımlarınızı bekliyorum. saygılarımla

  63. Yağmur dedi ki:

    Merhaba
    Sitemin ana url sine frame olarak yönlerdiğim alan adının ana url gibi index.php olarak açılmasını nasıl sağlayabilirim acaba?

  64. Tolga Duman dedi ki:

    Merhaba. Öncelikle bu şahane paylaşım ve bilgilendirme için teşekkür ediyorum. MaşaAllah. Bir wordpress sitenin kaynak kodlarını htaccesle gizleyebilirmiyiz? Sitenin kaynak kodlarını biri açınca karşısına sitenin wordpress altyapısı ile yapılmış olduğu bilgileri çıkıyor. örneğin wp-content/themes/ vs vs diye gidiyor. Bunun görünmesini engelleyebilirmiyiz?. Sitenin wordpress altyapısını htaccesle gizleyebilirmiyiz?. Bilgi verirseniz sevinirim.

    • Musa Avcı dedi ki:

      Neden gizlemek istiyorsunuz ki, aksine gurur duyulacak bir şey 😛

      Bahsettiğiniz gibi css, js ve imaj dosyalarını ana dizindeki başka bir klasöre taşıyın. Bir de wp-admin giriş dosyasını da değiştirebilirsiniz. Bununla alakalı bazı kaynaklar var araştırırsanız bulabilirsiniz.

  65. mustafa dedi ki:

    RewriteRule ^sayfa sayfa1.php [NC]
    RewriteRule ^sayfa/sayfa2 sayfa2.php [NC]
    Hocam birinci seçenekte problem yok ama 2. seçenekte de aynı sayfa açılıyor. Yardımcı olabilirmisnizi nedere hata yapıyprum

  66. cem dedi ki:

    Slm
    Site adı şöyle açılıyor
    http://www.siteadi.com/index.php

    site açıldığı zaman http://www.siteadi.com şeklinde görünmesini yani /index.php görünmesin istiyorum ne yapmam gerekir
    teşekkürler

  67. cem dedi ki:

    slm

    subdomaini yönlendirdiğim sayfada adres yerinde subdomain adresinin görülmesini istiyorum ne yapmam gerekir

  68. Onuray dedi ki:

    Merhaba Musa kardes “Subdomain ya da dizin yönlendirme“ kodlarini kullandim fakat basarili olamadim yonlenmiyor. yonlendirmek istememin sebebi opencart kurdum http://www.siteadi.com olarak girdigimde site duzgun calisiyor. fakat siteadi.com olarak girdigimde site duzgun calismiyor. (örn. sepede ekle butonlari bazi image lar sitedeki butun ozellikler.) bunu nasil duzeltebilirim? teamwiewer versem yardimci olurmusunuz? cevabinizi bekliyorum tesekurler.

  69. cihan dedi ki:

    ooooo son zamanlarda gördüğüm en güzel türkçe makale.10 satır okudum hemen sık kullanılanlara ekledim.Emeğinize sağlık çok teşekkür ederim kendi adıma.

  70. Volkan Ataç dedi ki:

    Merhaba birde abimin firmasının internet sitesi var http://www.atacet.com.tr diye bunun url yapısı seo dostu değil bir bakıp bunun seo dostu yapmam için gerekli kodlar konusunda yardımcı olursanız sevinirim iyi çalışmalar.

  71. ilhami dedi ki:

    Arkadaşlar şöyle bir link yapısı için nasıl bir kodlama gerekir
    (linklerin veritabanından çekilmiş id leri var onların göstermeden)?
    taxiyo.com/transfers/turkey/
    taxiyo.com/transfers/dalaman-airport/
    taxiyo.com/transfers/dalaman-airport/marmaris/

  72. Ersin dedi ki:

    Şu yaptığınızın değeri yok. Yemin ediyorum paha biçilemez harika açıklamalar ve paylaşımlar. Helal olsun…

  73. Serkan dedi ki:

    Selamlar hocam. Sitede direk kalıcı yönlendirmeyi yapıyoruz ama subdomainle gelen bağlantıyı bi türlü halledemedik..

    Örnek:

    http:sub.benim-sitem.com adresinden geleni,
    http:sub.senin-siten.com’a yönlenmesini istiyoruz ama olmuyo ve bu başta yazdığım ”sub” sürekli değişken oluyo. Tek tek yapabiliyoruz ama öyle uğraşmadan 1 kodla halledebilirmiyiz?

    Yardım ederseniz sevinirim.. Şimdiden teşekkürler.

  74. Sunay dedi ki:

    Musa Hocam. WordPress ile kurulmuş bir sitem var.Ortalama 100 adet yazı yazdım ve kalıcı bağlantılardan .com uzantısını .html olarak değiştirdiğimde yazılarda “sayfa bulunamadı” hatası alıyorum.Sonradan değiştirince neden bu şekilde bir sorun yaşıyorumdur ?

    İyi çalışmalar,

  75. Kabuk Satışı dedi ki:

    Müthiş bir yazı olmuş.Bir çok soru işaretni giderdi bende.Ellerinize sağlık.Kaliteli bir library oldu benim için

  76. Dora Deniz dedi ki:

    Dediğiniz Gibi Harfi harfine yaptım .htaccess adlı bir dosya oluşturup tüm dosyaları seçip yaptım fakat localda boyle bir hata alıyorum
    “500 Internal Server Error” ne yanlış yaptığımı bana söylerseniz sevinirim

    • Musa Avcı dedi ki:

      htaccess dosyanızda hata yapmış olabilirsiniz, sakıncası yoksa hatayı daha iyi anlayabilmemiz için htaccess dosyanızın içeriğini burada paylaşabilir misiniz?

  77. ferhat duman dedi ki:

    anlatım çok güzel hocam ama benim sorum şöyle sitemi tamamen link yapısını değiştirmek istiyorum öncelikle
    sarki.php?sarki_id=123 browserda bu şekilde görünüyor ben bunu .htaccess ile sarki/deniz-seki-adaletsiz–secim olarak yapmak istiyorum google aramalarında sayfalar hata verecek ve gerileyecek nasıl bir yol izlemem lazım yönlendirme için… ? şimdiden teşekkürler

  78. teoman yavaş yavaş albümü dedi ki:

    çok sağolun

  79. Ali KARAÇAY dedi ki:

    merhabalar, bu sayfayı daha önce de ziyaret ettiğim için sık kullanılanlara eklemiştim, o zamanlar bu url formatlamada çok işime yaramıştı ama şu an problemliyim. yapmaya çalıştığım şey:
    domain.com/index.php?tur=makale&id=5&adres=neden-olmuyor
    şeklindeki yapıyı
    domain.com/makale/5/neden-olmuyor.html
    şeklinde kullanmak..
    .htaccess dosyam:
    RewriteEngine On
    RewriteBase /
    RewriteCond %{HTTP_HOST} !^www.
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)/(.*)/(.*)$ index.php?tur=$3&id=$2&adres=$1 [QSA,L]
    burada htaccess çalışıyor, ancak adres değeri olmadığı zaman arkaplanda makale/5.php gibi bir dosya çağırmaya çalışıyor. index sayfamdaki şu koddan dolayı:
    $stur = $_GET[‘tur’];
    if($stur==NULL){
    require_once(‘anasayfa.php’);}
    else {require_once($stur.’.php’);}
    işin içinden çıkamaz oldum, bi yardım bi el atıverin 🙂
    bu arada sözü geçmişken her parametreye sadece kendi değerini nasıl aldırabilirim? yani require ederken tur parametresini id ile birlikte almamasını nasıl sağlarım (genel yapı olarak, sadece tur için değil)

  80. Bayram dedi ki:

    Merhaba Hocam şöyle bir sıkıntı var, localhost/Project/adminweb/listeleme linkini htacces ile localhost/Project/listeleme şekline nasıl dönüştürebilrim.
    Şu an kullanılan hacces kodu;
    RewriteRule ^([0-9a-zA-Z-_/]+)$(/?) index.php?url=$1 [QSA,L] bu şekildedir.

  81. bünyamin dedi ki:

    Koly gelsin .html uzantısını nasıl gizleyebilirim peki bir yardım edermısınız?

  82. ferhat dedi ki:

    anlatım çok güzel ve çok işime yaradı ancak iki tablodan bilgi çekiyorum oda şöyle
    marka.php?marka_id=20&id=35 diye bilgi çekiyorum ve içeriği yazdırabiliyorum.
    ancak işin içine htaccess girince biraz karıştırdım. linki çağırıyorum ancak başaramadım içerik listeletemiyorum.
    /// htaccess kodu ///
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^marka/([0-9a-zA-Z-_]+)/(.*)$ marka.php?marka_id&id=$1&kat_adi=$2 [L,NC]

    /// php kdum link ///
    marka/.html

  83. ferhat dedi ki:

    php link kodum
    marka/20/35/tofas-s.html die ekrana çıkıyor fakat içi boş geliyor

  84. Pembe.Us dedi ki:

    gerçekten verdiğiniz bilgiler çok işime yaradı özellikle spam botları sitelerden uzak tutma kodunu hemen ekledim kendi htaccesime.. teşekkür ederim admin.

  85. ehil dedi ki:

    Netteki en ayrıntılı bilgi kaynaklarından biri php hakkında merak ettiğim bir şey olursa buraya bakıyorum teşekkürler elinize sağlık

  86. Dosya Yükle dedi ki:

    Siteye giren botlara nasıl doğrulama sorabilirim ?

  87. Cemal dedi ki:

    Merhaba Musa Bey,

    adres çubuğuna siteadi.com.tr/index.php yazıldığında url’sinin hiç açılmayıp siteadi.com’a yönlenmesini istiyorsak hangi kodu kullanmalıyız?

  88. murat demirci dedi ki:

    sitemde çoklu dil var ve ben htaccess olarak şunu yapmak istiyorum siteadi.com/tr yada siteadi.com/en diğer sayfalar içinde siteadi.com/tr/kategori yada siteadi.com/en/category bunu nasıl yapabilirim ardımcı olurmusunuz

  89. MURAT İNTEPE dedi ki:

    Ana dizindeki seo için uyguladığımız .htaccess sub domainlerimi de etkiliyor. subdomainlerin etkilenmemesi için bir önerisi olan var mı arkadaşlar ?

    Şimdiden teşekkürler…

  90. Çağrı Tekir dedi ki:

    Yararlı bilgiler için teşekkürler hocam

  91. İdris KANIBOL dedi ki:

    Beş para etmez.

  92. Webmaster dedi ki:

    çok kaliteli bir paylaşım teşekkür ederim.

  93. Muhammet dedi ki:

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d

    kodları dizinleri RewriteRule komutundan etkilenmekten alıkoyamıyor dizinler de etkileniyor acaba nerede hata yapıyor olabilirim ?

  94. İşsiz Kağıt dedi ki:

    Hocam acaba bu yöntemle selamlar.com diye aratılınca http://www.issizkagit.com sitesine yönlendirme yapabilir miyim?

  95. Faruk dedi ki:

    Çok teşekkürler ❤

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir