Sayfa Düzeni: 1 / 3 1 2 3 SonSon
Toplam 23 sonuçtan 1 ile 10 arası olanlar

Konu Başlığı: Mod_Rewrite Kılavuzu

  1. #1

    Mod Rewrite Kılavuzu

    mod_rewrite’ı veya htaccess dosyaları ile yönlendirme yapmayı duymayan kalmamıştır. standart bir htaccess dosyasına bakacak olursak:

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

    bu kurallar Wordpress’in rewrite kuralları.

    1. satırda Rewrite motorunun kullanılacağını belirtiyoruz.
    2. satırda bu kuralların bütün kök ve alt dizinlerde geçerli olduğunu söylüyoruz.
    3. satırda REQUEST_FILENAME değişkeninde tutulan isimde bir dosya eğer yoksa diyoruz
    4. satırda REQUEST_FILENAME değişkeninde tutulan isimde bir klasör eğer yoksa diyoruz
    5. satırda bütün istekleri index.PHP'ye gönder deyip L (LAST) bayrağı ile bu conditionları sağlayan durumlarda yapılacak son rewrite'ın bu olduğunu belirtiyoruz.

    Detaylı İnceleme

    RewriteEngine on|off

    Apache’de , öntanımlı olarak rewrite motoru kapalı olarak geliyor. mod_rewrite ile yönlendirme yapacaksak eğer ilk satırda RewriteEngine On’a ihtiyacımız var.

    RewriteOptions Seçenek


    Burada Kullanabileceğimiz iki seçenek var. MaxRedirects değeri ve inherit opsiyonu. MaxRedirects aynı isteğin kaç kere yeniden yazılacağını belirliyor. inherit ise MaxRedirets’in değerinin bir üst klasörde geçerli olan değer olmasını söylüyor. Öntanımlı olarak MaxRedirects=10, inherit ise kapalı.

    RewriteBase URL

    Fiziksel yer ile sanal yer farklı ise RewriteBase ile isteklerin nereye geldiğini belirtmemiz gerekiyor. Örneğin sunucuda /home/yiit/ahmet/mehmet klasöründe bulunan dosyalarımız url olarak www.site.com/cenk yolu ile çağırılıyorsa /home/yiit/ahmet altındaki .htaccess’de


    Kod:
    RewriteBase /cenk
    bulundurmamız gerekiyor.

    RewriteCond var1 var2

    RewriteCond’u eğer var1 var2′ye uyuyorsa bir sonraki satıra geç şeklinde bir if yapısı olarak düşünebiliriz. şöyle örnekler sunabiliriz:


    Kod:
    RewriteCond %{REQUEST_URI} yiit.PHP
    bu satır, eğer %{REQUEST_URI}, yiit.PHP ise diyor. yiit.PHP’nin başına ünlem koyarak (!yiit.PHP) REQUEST_URI, yiit.PHP değilse diyebilirdik.


    Kod:
    RewriteCond %{HTTP_HOST} gro.tiiy.yiit.org
    burada ise eğer HTTP_HOST, gro.tiiy.yiit.org ise diyoruz. .htaccess dosyasında düzenli ifadeler (regular expressions - regex) de kullanabiliriz. Aynı örneği geliştirelim:

    Kod:
    RewriteCond %{HTTP_HOST} !www.yiit.org
    RewriteCond %{HTTP_HOST} ([^.]+).yiit.org
    burada subdomain eğer www dışında bir şeyse dedik. ileride subdomain ismine erişmek istersek %1 değişkenini kullanabiliriz. burada dikkat edilmesi gereken şey iki rewritecond arasında bir AND olduğu. yani sadece bu ikisini de sağlayan durumlar rewriterule’a geçebilecek. eğer ikisinden birini sağlamasını isteseydik OR bayrağını kullanacaktık:

    Kod:
    RewriteCond %{HTTP_HOST} !www.yiit.org [OR]
    RewriteCond %{HTTP_HOST} ([^.]+).yiit.org
    Kullanabildiğimiz Değişkenler

    RewriteCond ile oluşturduğumuz değişkenlere %n şeklinde ulaşabiliyoruz. örneğin

    Kod:
    RewriteCond %{HTTP_HOST} ^(.*).(.*)
    böyle bir kuralımız varsa birinci (.*) yani HTTP_HOST’un ilk noktadan önceki parantezlerle ayrılmış kısmı %1, ilk noktadan sonraki parantezlerle ayrımış kısmı %2 oluyor.

    RewriteRule değişkenleri ise $n şeklinde. rewritecond ve rewriterule değişkenlerini aynı kuralın içinde kullanmak mümkün:

    Kod:
    RewriteCond %{HTTP_HOST} ([^.]+).yiit.org
    RewriteRule ^(.*)$ yok.PHP?adres=$1&sd=%1
    bu durumda gro.tiiy.yiit.org/ahmet.PHP aslında yiit.org/yok.PHP?adres=ahmet.PHP&sd=gro.tiiy olarak işlem görecek.

    Sunucu değişkenleri ise %{SUNUCU_DEGISKENI} şeklinde kullanılıyorlar. tam listesini yazının sonuna ekliyorum.

    RewriteCond’da kullanabileceğimiz iki bayrak var. bunlar NC ve OR. NC (nocase) büyük-küçük harf duyarsız işlem yapılmasını söylüyor. OR ise daha önce söylediğim gibi iki rewritecond’u öntanımlı olan and yerine or ile bağlamasını söylüyor.

    bunların dışında RewriteCond parametreleri var. Wordpress örneğinde gördüğümüz -f ve -d dışında -s ve -l var. -s’nin işlevi -f gibi, fakat yaratılmış bir dosyanın var olup olmadığından fazla olarak bu dosyanın boyutunun 0′dan büyük olup olmadığına da bakıyor. -l ise böyle bir symlink olup olmadığına bakıyor. bu dört parametre de ünlem işareti ile birlikte anlamlarının tersine kullanılabilir. (!-f)

    RewriteRule

    Örnekle başlayalım:

    Kod:
    RewriteRule ^(.*)$  yok.PHP?adres=$1 [L]
    Bu kural gelen bütün istekleri yok.PHP’de $_GET[’adres’] değişkeninin içine atar. yani /index.PHP’ye girmek istedi diyelim ki kullanıcı, sunucu ona aslında yok.PHP?adres=index.PHP’yi gösterir. Ama bu bir yönlendirme şeklinde olmaz, adres aynı kalır.

    RewriteRule bayrakları

    [bayrak] şeklinde kullanılıyorlar.

    R=301: Belirttiğiniz adrese 301 yönlendirmesi yapar.
    F: Forbidden belirttiğiniz adres 403 döndürür. Kullanıcılara sayfayı görmesi için izin verilmez. RewriteCond ile birlikte kullanılıp toplu adres engellemesi yapılabilir.
    L: Bu rewriterule’ın son yönlendirme olduğunu söyler. Eğer bu bayrak olmazsa mod_rewrite maxredirects değişkeniniz doğrultusunda sürekli yönlendirme yapacaktır.
    NC: büyük küçük ayrımı yapmadan rewrite yapar.
    QSA: GET ile gelen isteği de adrese ekler.


    ErrorDocument hatakodu URL

    .htaccess dosyamızda ErrorDocument kullanarak yönlendirme de yapabiliriz. Örnek kullanımı:
    Kod:
    ErrorDocument 404 http://www.site.com/404.PHP
    ErrorDocument 403 http://www.site.com/yetkisiz.PHP
    server Değişkenleri

    headers:

    HTTP_USER_AGENT
    HTTP_REFERER
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST
    HTTP_PROXY_CONNECTION
    HTTP_ACCEPT

    connection & request:

    REMOTE_ADDR
    REMOTE_HOST
    REMOTE_USER
    REMOTE_IDENT
    REQUEST_METHOD
    SCRIPT_FILENAME
    PATH_INFO
    QUERY_STRING
    AUTH_TYPE

    server internals:

    DOCUMENT_ROOT
    SERVER_ADMIN
    SERVER_NAME
    SERVER_ADDR
    SERVER_PORT
    SERVER_PROTOCOL
    SERVER_SOFTWARE

    system stuff:

    TIME_YEAR
    TIME_MON
    TIME_DAY
    TIME_HOUR
    TIME_MIN
    TIME_SEC
    TIME_WDAY
    TIME

    specials:

    API_VERSION
    THE_REQUEST
    REQUEST_URI
    REQUEST_FILENAME
    IS_SUBREQ
    Mesaj tapoem tarafından 06.10.2007 (17:37) yeniden düzenlendi.
    gro.tiiy.yiit.org || Detaylı .htaccess kılavuzu, WireShark, Ruby, vs.

  2. #2

    Re: Mod_Rewrite Kılavuzu

    Budur! Eline sağlık dostum

  3. #3

    Re: Mod_Rewrite Kılavuzu

    Kısa, özet, konuyla ilgili yeterli bir kaynak olmuş. Eline sağlık.
    Spoiler:
    imzaya sponsor?

  4. #4

    Re: Mod_Rewrite Kılavuzu

    Sonunda...

    Çok iyi oldu, teşekkürler...
    Disconnected

  5. #5

    Mod_Rewrite Kılavuzu

    URL Rewrite'da mantığı konusunda tıkandığım iki nokta var.

    Birincisi; gördüğüm çoğu URL Rewrite işlemlerinde URL'nin bir bölümünde yazı, kategori vs.nin ID no.su bulunuyor.
    Fakat Wordpress, URL Rewrite işlemini ID kullanmadan yapıyor.
    Bunu nasıl yapıyordur?

    Bir diğeri de bizzat karşılaştığım bir sorun;
    Veritabanında yer alan yazı ve kategori tablolarının birincil indeksleri aynı değerde yani ID.
    Bu durumda da URL Rewrite yapıldığında kategori ile yazı ID'leri karışıyor.
    Ayırmak için ne tür bir yol izlenmeli?
    Yoksa her tablonun indeksi farklı mı olmalı?

  6. #6

    Re: Mod_Rewrite Kılavuzu

    Wordpress bütün istekleri index.PHP'ye gönderip post-slug'ı veritabanında sorgulatarak id'yi buluyor.

    ikinci sorunuzu anlamadım.
    gro.tiiy.yiit.org || Detaylı .htaccess kılavuzu, WireShark, Ruby, vs.

  7. #7

    Mod_Rewrite Kılavuzu

    Kod:
    Kategori Tablosu:
    id	kategori	sira
    1	Günlük		1
    2	Genel		3
    
    Yazı Tablosu:
    id	baslik		  yazi		  tarih
    1	Başlık 1	Yazı 1		01.10.2007
    2	Başlık 2	Yazı 2 		02.10.2007
    3	Başlık 3	Yazı 3 		03.10.2007
    Herhangi bir sayfadan /1-baslik-1.HTML linkine de tıklansa /1-gunluk.HTML linkine de tıklansa aynı sayfa açılıyor, birincisinde Başlık 1 yazısının, ikincisinde ise Günlük kategorisinin açılması gerekirken.

  8. #8

    Re: Mod_Rewrite Kılavuzu

    E tabi bu durumda "gunluk" ya da "baslik" şeklinde yazılan kısmın da PHP'ye bir parametre olarak gönderilmesi ve sorgulamanın ona göre yapılması gerekiyor

  9. #9

    Mod_Rewrite Kılavuzu

    Veritabanından veri sorgulamasını ID'ye göre yaptığı için başlık veya kategori isminin URL'de geçmesi herhangi birşeyi değiştirmiyor maalesef.

  10. #10

    Re: Mod_Rewrite Kılavuzu

    Anlaşamadık Demek istediğim şu, veritabanında aramayı yine ID'ye göre yapıyoruz zaten ancak ek parametre olarak(örn. tip) aldığımız şey "baslik"sa başka bir tabloda "kategori"yse başka bir tabloda arama yapacak.

    Yazdığın ilk mesajdan bunlar için iki ayrı tablon olduğunu anlıyorum ki zaten karışıklık olması için de iki ayrı tablo olması gerekiyor. Sen de 2. bir değişkenle hangi tabloyu kullanacağını belirleyeceksin sorun çözülmüş olacak. Yoksa benim kaçırdığım bir nokta mı var?

Sayfa Düzeni: 1 / 3 1 2 3 SonSon

Bu konu başlığı için etiketler

Mesaj Seçenekleri

  • Yeni başlık açamazsınız
  • Cevap yazamazsınız
  • Dosya ekleyemezsiniz
  • Mesajlarınızı değiştiremezsiniz