İyinet'e Hoşgeldiniz!

Türkiye'nin En Eski Webmaster Forum'una Hemen Kayıt Olun!

Kayıt Ol!

Seo Link ve RewriteRule Problemi

OsmanAtabey

0
İyinet Üyesi
Katılım
26 Mart 2005
Mesajlar
922
Reaction score
4
Selam

RewriteEngine on
RewriteRule ^(.*)/(.*).html$ seo1.php?kategori=$1&baslik=$2 [L,QSA,NC]
RewriteRule ^(.*)/$ seo2.php?kategori=$1 [L,QSA,NC]
RewriteRule ^(.*)$ seo3.php?sayfa=$1 [L,QSA,NC]

.htaccess içinde yukarıdaki 3 kural var.

1. kuralın görevi kategori ve basligi alip en önemli görevi üstleniyor.Tüm döküman linklerini seolu halde kullanmamı sağlıyor

2. kural domain/kategori/ şeklinde olan girişleri seoluyor ve o kategoriye ait olan dökümanları arşiv halinde listelememe yardımcı oluyor.

3. kural domain/iletisimsayfasi veya domain/makaleler gibi olan sayfaları .php veya .html ek kullanmadan göstermemi sağlıyor.

Buradaki problem 3. kuralı açtığımda ilk 2 kural çalışmıyor. 3. kuralı kapadığımda ilk 2 kural sorunsuz çalışıyor. Benim hepsini çalıştırabileceğim bir kural varmıdır veya ne tür bir yöntemle bu işi çözebilirim ?
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
Konum
AZ
Bunu bu sekilde yapan binlerce kisi ve script aslinda kulagini tersten gosteriyor. Ne gerek var bu kadar kural tanimlamaya. Sadece ucuncu kurali tanimlayabilirsin. Sitene gelen her turlu hiti tek bir dosyaya yonlendirirsin. Router gorevi gorur bu dosya. Nasil router modemden gelen interneti paylastiriyor, bu dosyada gelen tum hitleri URL Yapisina gore dagitir.

Tum dosyalar route.php ye yonlense.

Route.php de $_SERVER[REQUEST_URI] ye bakilsa.

- bu degiskenin degeri mesela /yazi
dersin ki tek slash varsa, bir yazidir, include yazi.php

- bu degiskenin degeri /kategori/yazi
iki slash varsa kategori alt dizinidir, include seo1.php
 

OsmanAtabey

0
İyinet Üyesi
Katılım
26 Mart 2005
Mesajlar
922
Reaction score
4
Angelo route.php için küçük bir örnek fena olmazdı ama yinede bu söylediklerinden yola çıkarak yapmaya çalışayım teşekkürler
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
Konum
AZ
kod da hata olabilir ama basitce mantik su.
sen de 3 senaryo var, bazilarinda daha cok oluyor ona gore deisik yonlendirme kurulumlari yazilabilir. biz alisveris sepeti uygulamasinda her url yi veritabanina yazip ne sayfasi oldugunu oradan cekiyoruz. boylece istedigimiz sayfaya istedigimiz URL yi verebiliyoruz. Slash, dash sayisi, basa sona belli bir prefix (kategori, makele vb) ya da makale, kategori id'sini de URL icinde filan verme gibi uygulamalara gerek kalmiyor.
PHP:
$q = $_SERVER['REQUEST_URI'];
$x = explode('/',$q)
$c = count($x);

  if ($c == 2) {
  $_GET['sayfa'] = $x[1];
  include ('seo3.php');
  exit; 
  }
  if ($c == 3 AND trim($x[2]) == '') {
  $_GET['kategori'] = $x[1];
  include ('seo2.php');
  exit;
  }
    if ($c == 3 AND trim($x[2]) != '') {
  $_GET['kategori'] = $x[1];
  $_GET['baslik'] = $x[2];
  include ('seo1.php');
  exit;
  }
 

OsmanAtabey

0
İyinet Üyesi
Katılım
26 Mart 2005
Mesajlar
922
Reaction score
4
Angelo bu verdiğin örnek tüm işlemi basit bir şekilde yapıyor fakat benim şu anki php bilgim bu örnekle çalışmaya müsait değil :) o yüzden bu kodun genel mantığını anladıktan sonra ortaya birşeyler çıkarabilirim belki. Ben problemleri genelde basit şekillerde çözdüğüm için kulağı tersten göstermeye alışığım.
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
Konum
AZ
Evet kod degisken dedigim gibi. Mantik HTACCESS ile her sey icin kural belirleyip bogusacaginiza merkezi bir sistem kuruyorsunuz. PHP'de url yi duruma gore haritalamak daha kolay nitekim. htaccess den kurtuldugumdan beri geceleri daha rahat uyuyorum:)
 

OsmanAtabey

0
İyinet Üyesi
Katılım
26 Mart 2005
Mesajlar
922
Reaction score
4
Gerçektende tek sayfada sorunsuz hızlı bir biçimde çalışıyor teşekkürler Angelo
 

Loi

0
İyinet Üyesi
Katılım
13 Kasım 2006
Mesajlar
6,192
Reaction score
44
Konum
localhost
Incelediniz mi bilmem ama WordPress'de bu şekilde calisiyor. En saglikli yontem bu.
 

OsmanAtabey

0
İyinet Üyesi
Katılım
26 Mart 2005
Mesajlar
922
Reaction score
4
Detayları anlamak için sadece gelen veriyi aldım explode ile parçaladım ve mysql sorgusuna gönderip sonuca ulaştım. Fakat bu şekilde yapınca url üzerine herşeyi ekleyebiliyorum ve hiçbir 404 hatası almıyorum.

Bu arada bende kendim için wordpress benzeri bir içerik yönetim sistemi yapmaya çalışıyorum. Admin paneli hazır ve şu seo kısmınıda atlattık mı sonuca ulaşıcam :)
 

Loi

0
İyinet Üyesi
Katılım
13 Kasım 2006
Mesajlar
6,192
Reaction score
44
Konum
localhost
Detayları anlamak için sadece gelen veriyi aldım explode ile parçaladım ve mysql sorgusuna gönderip sonuca ulaştım. Fakat bu şekilde yapınca url üzerine herşeyi ekleyebiliyorum ve hiçbir 404 hatası almıyorum.

Bu arada Loi bende wordpress benzeri bir içerik yönetim sistemi yapmaya çalışıyorum kendim için admin paneli hazır ve şu seo kısmınıda atlattık mı sonuca ulaşıcam :)

Contentler için tabloda bir sütun daha aç ve URL kontrollerini buna dayanarak yaptır. Eğer explode ettigin REQUEST_URI ile content icin tanımlı(örnek /content1.html) bilgi uyuşmuyorsa header location ile 404 verdirebilirsin.
 

OsmanAtabey

0
İyinet Üyesi
Katılım
26 Mart 2005
Mesajlar
922
Reaction score
4
Üzerinde çalıştığım sayfa içeriği iyice dağılmış Else kısımlarını atlamışım bayağı fakat şimdi güzel bir şekilde çalışıyor. Şu anda bir tek sorun gözüküyor oda sayfa ile kategori yapılarını veritabanından alıp aynı sayfada if ile sorgularken çakışma yaşanıyor olması. Çünkü her ikiside domain/sayfam ve domain/kategori şeklinde ve herhangi bir uzantısı yok.
 

Loi

0
İyinet Üyesi
Katılım
13 Kasım 2006
Mesajlar
6,192
Reaction score
44
Konum
localhost
olmasıda gerekmiyor type diye bir sutun ac kategori ise 1 sayfa ise 0 ver. Check ettir.
Boylece kategorileride ayrı birer content gibi sunabilirsin.
 

OsmanAtabey

0
İyinet Üyesi
Katılım
26 Mart 2005
Mesajlar
922
Reaction score
4
if sorgularını birleştirmiştim fakat karşılaştırma işlemlerinde yine sorunlar çıktığını gördüm. Senin dediğin şekilde yapmam gerekiyor. Sabahın 4 'ünde iyi destek çıktın Loi sağolasın :)
 

Loi

0
İyinet Üyesi
Katılım
13 Kasım 2006
Mesajlar
6,192
Reaction score
44
Konum
localhost
SQL sorgusundan dönen sonuclar arasında, type sutunundan gelen verinin degerine gore kategori sayfası olup olmadığını ayrıştırabilirsin

Kısacası SQL den gelen değerlerde kategori icin 1 content için 0 değerlerini vermiştik varsayıyorum ve SQL deki türü belirleyen değerinde $sql[type] oldugunu varsayarak

PHP:
if ($sql[type] == "1") { include("kategori.php"); } 
else { include("content.php"); }

yazabiliriz
 

OsmanAtabey

0
İyinet Üyesi
Katılım
26 Mart 2005
Mesajlar
922
Reaction score
4
Bu yöntem bir problem makinası oldu benim için mübarek

- Olmayan veya yanlış şekillerde giriş yapılan sayfa, kategori ve yazılar boş bir sayfaya yönleniyor bazıları ise else tarafında yazdığım kurala denk geliyor. Tamamını hata mesajına nasıl yönlendirebileceğimi bulamadım. Bir taraftan bunu yapmaya çalıştığımda esas sorgular bozuluyor. İki ucu .oklu değnek misali.

- Her gelen veri aynı sayfada bulunan ve 3 değişik alan için yazılmış sorgulardan geçiyor. Çünkü gelen benzer verileri bu sorgular ayırt edemediği için çıkan sonuçlarda sorunlar çıkabiliyor. Örnek : Kategori sorgusu domain/kategori 'yi kategori olarak görürken domain/kategori/ 'yi tanımıyor bir fazla / işareti yüzünden. Eğer sorgu içinde / işaretine ait sayıyı bir fazla arttırırsam bu sefer gelen değişik veriler üzerinde sorunlar çıkıyor.

Yazı sorgusu domain/kategori/seo-yazi.html şeklinde veritabanında kayıtlı olan yazıyı tanırken. Sadece kategori kısmı değiştirildiğinde yazı sorgusu tarafından yakalanamıyor ve kategori sorgusu tarafından yakalanıp böyle bir kategori yok mesajını verdirebiliyor.

Mesela domain/kategori veritabanında varken ve sorgular tarafından tanınıyorken domain/kategorim veya domain/kategori5 direkt boş bir sayfaya yönleniyor. Aynı şey sayfa ve yazıların içinde bulunduğu linkler içinde geçerli. Yanlış gelen verilerin çoğu boş sayfaya yönleniyor.


Bu arada çözemediğim diğer problem :)

domain/kategori veya domain/sayfaismi şeklindeki girişlerde ilgili kategoriye veya sayfaya ait veriler için bir .php dosyası oluşturup verileri ordan almam gerekiyor ( wordpress mantığı archive.php ve single.php ) veritabanına girdigim isim ile oluşturduğum .php uzantılı dosyayı nasıl ilişkilendirebilirim .php uzantısı görünmeden.
 

Angelo

0
İyinet Üyesi
Katılım
13 Aralık 2004
Mesajlar
9,603
Reaction score
111
Konum
AZ
Benzer URL'ler icin type uretip db ye koyacaksin. Type=1 Type=2 gibi. Tabiki URLler birbirine benzeyecek bunun onune gecemezsin. Hicbirseyi yakalayaman URL'ler router inda en son else adiminda header 301 ana sayfa yaparsin olabilir. Boylece kirik link veya bos ekran gelmez.
 

OsmanAtabey

0
İyinet Üyesi
Katılım
26 Mart 2005
Mesajlar
922
Reaction score
4
Loi, şu anda 3 tane değişik alan ( kategori, sayfalar ve yazilar ) için yazılmış if sorguları dışında başka bir kodum yok. Gelen veriyi alıyorum explode yapıyorum ve sorguya yolluyorum.

Angelo, anladım fakat gelen yanlış veya kırık linkler route sayfasına yönleniyor ve ortaya sadece boş bir sayfa çıkıyor. Benim bunu yakalayabilmem lazım ki 404 veya index sayfasına yönlendirebileyim. Bu yüzden her gelen veri için ayrı bir sorgu ve karşılaştırma yazıyorum ve denemeler yapıyorum.

Ayrı şekilde yapılan sorgu ve karşılaştırmalarla çözüm bulduklarım :

- domain/kategori ve domain/kategori/ aynı şekilde algılanıyor.
- domain/kategori/seo-yazi.html şeklinde olan ve domain/kategori/seo-yazi5.html şeklinde yanlış yazılmış bir yazıyı kategori olarak algılamıyor ve hata sayfasına yonleniyor.
- Yukarıdaki gibi doğru bir yazi linkinin kategori bölümü değiştiğinde hata sayfasına yönleniyor.

Çözüm aradıklarım :

- Boş sayfaya yani route sayfasına yönlenenler için karşılaştırma ve sorgu yapmam gerekiyor.
- domain/kategori/ veya kategori şeklinde ki girişlerde o kategoriye ait verileri listeletmem lazım.
 

Türkiye’nin ilk webmaster forum sitesi iyinet.com'da forum üyeleri tarafından yapılan tüm paylaşımlardan; Türk Ceza Kanunu’nun 20. Maddesinin, 5651 Sayılı Kanununun 4. maddesinin 2. fıkrasına göre, paylaşım yapan üyeler sorumludur.

Üst