SEF Adresler
SEF (arama motoru dostu) adresler, index.php?do=cat&category=5 gibi
adresleri /haberler/ekonomi/ biçimine çevirir. Arama motorları için önemlidir
ve DLE'de tamamen PHP tarafında çözülür.
Açma / kapama
SEF adresler Sistem Ayarları içindeki bir onay kutusuyla denetlenir:
allow_alt_url. Yanındaki birkaç ayar da konuyla ilgilidir:
| Ayar | Ne yapar? |
|---|---|
allow_alt_url | SEF adresleri açar/kapatır |
seo_type | Haber adreslerinin biçimi (aşağıda) |
seo_control | Adres biçimi denetimi |
translit_url | Adres üretilirken harf çevirisi yapılsın mı? |
own_404 | Özel 404 sayfası kullan |
seo_type değiştirirseniz adres kuralları güncellenir
DLE, seo_type değiştiğinde adres kurallarını otomatik olarak yeniden üretir.
Ayrıca SEF kapalıyken seo_type boşsa DLE onu 2 yapar — pano
bazen "kendiliğinden değişti" izlenimi verir, sebebi budur.
Haber adresi biçimleri
| seo_type | Örnek adres |
|---|---|
1 | /123-haber-basligi.html |
2 | /kategori/alt-kategori/123-haber-basligi.html |
3 | /2008/04/02/haber-basligi.html |
Adresler nasıl üretilir?
Adres üretiminden DLEUrl sınıfı sorumludur
(engine/classes/urls.class.php). Sınıf tamamen
statiktir ve metodu şudur:
DLEUrl::BuildUrl($key, $params)
- İlk parametre
$key'dir,$typedeğil. İkinci parametre ise bir dizidir. DLESEOsınıfı adres üretmez.engine/classes/seo.class.phpyalnızca schema.org işaretlemesi, meta etiketleri ve IndexNow bildirimi ile ilgilenir. Adres işi tamamenDLEUrl'e aittir.
Gerçek kullanım örnekleri:
// Haber adresi
$full_link = DLEUrl::BuildUrl('showfull', array(
'category' => get_url($row['category']),
'year' => date('Y', $row['date']),
'month' => date('m', $row['date']),
'day' => date('d', $row['date']),
'news_name' => $row['alt_name'],
'newsid' => $row['id'],
));
// Kategori adresi
$kategori = DLEUrl::BuildUrl('category', array('category' => get_url($cat_id)));
Desteklenen anahtarlar
BuildUrl'un kabul ettiği $key değerleri (her birinin
.page varyantı da vardır):
showfull, showfull.print, main.page,
date.day, date.month, date.year,
category, static, static.print,
tags, tags.all, xfsearch,
user, user.news, user.rss,
lastnews, catalog, newposts,
favorites, rules, statistics,
addnews, rss, rssdzen, rss.category
Yeniden yazma kuralları (.htaccess)
Çoğu sistemde her adres biçimi için ayrı bir RewriteRule yazılır. DLE böyle
yapmaz: tüm adresler index.php'ye gönderilir ve SEF çözümü
PHP içinde yapılır.
DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
# Var olmayan dosya istekleri (php, jpg, css, woff2 …) → 404
RewriteRule \.(php|jpg|...|woff2)(\?|$) - [L,NC,R=404]
# Site haritaları özel yollardan servis edilir
RewriteRule ^sitemap.xml$ uploads/sitemap.xml [L]
RewriteRule ^google_news.xml$ uploads/google_news.xml [L]
RewriteRule ^static_pages.xml$ uploads/static_pages.xml [L]
RewriteRule ^category_pages.xml$ uploads/category_pages.xml [L]
RewriteRule ^tags_pages.xml$ uploads/tags_pages.xml [L]
RewriteRule ^news_pages(\d*?).xml$ uploads/news_pages$1.xml [L]
# Geri kalan her şey index.php'ye
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.php [L]
</IfModule>
.htaccess dosyası şarttır
Apache kullanıyorsanız ve SEF adresler 404 veriyorsa ilk bakılacak yer bu dosyadır:
ya yoktur, ya mod_rewrite kapalıdır, ya da dosya
AllowOverride None nedeniyle okunmuyordur. Nginx kullanıyorsanız aynı
mantığı Nginx kurallarına çevirmeniz gerekir.
Yönlendirme PHP'de nasıl çalışır?
// engine/init.php
if ($config['allow_alt_url']) {
DLEUrl::Route();
}
Route() metodu, adres kurallarını (FastRoute ile) eşleştirir. Üretilen rota
tablosu engine/cache/system/route.rules.php dosyasında önbelleklenir; kurallar
değişince yeniden üretilir.
Adres kurallarını yönetmek
Panelde SEF adres kuralları modülü
(engine/inc/friendlyurl.php) bulunur. Yalnızca ana yönetici
(grup 1) erişebilir.
| Yapabildikleriniz | Açıklama |
|---|---|
| Kural listesini görüntüleme | Her $key için SEF ve gerçek adres biçimi yan yana |
| Sıralama | Sürükle-bırak ile kural önceliği değiştirme |
| Düzenleme / ekleme / silme | Kendi adres kalıbınızı tanımlama |
| Geri yükleme | Varsayılan kurallara dönme |
| Denetleme | Kuralların çakışıp çakışmadığını test etme |
Kurallar engine/data/rules.json dosyasında saklanır.
Adres (slug) üretimi ve tekillik
Haberin adres parçası (alt_name) haber ekleme ekranında ayrı bir alandır.
Boş bırakılırsa başlıktan üretilir:
$alt_name = trim($_POST['alt_name'] ?? '');
if (!$alt_name) {
$alt_name = totranslit(stripslashes($title), true, false, $config['translit_url']);
}
alt_name ile ikinci bir haber eklemeye çalışırsanız
DLE hata verir ve kaydetmez. Bazı sistemlerde olduğu gibi
-2, -3 soneki eklenmez. Aynı kural kategoriler için de
geçerlidir.
Ayrılmış adres adları
Kategori veya sayfa adresi olarak şu adları kullanamazsınız — sistem tarafından ayrılmıştır:
tags, xfsearch, user, lastnews,
catalog, newposts, favorites
SEF kapalıyken adresler
| Ne? | Adres |
|---|---|
| Haber | index.php?newsid=123 veya index.php?subaction=showfull&year=…&news_name=… |
| Kategori | index.php?do=cat&category=ekonomi |
| Statik sayfa | index.php?do=static&page=hakkimizda |
| Etiket | index.php?do=tags&tag=spor |
Sık karşılaşılan sorunlar
| Belirti | Sebep / çözüm |
|---|---|
| Tüm SEF adresler 404 | .htaccess yok veya mod_rewrite kapalı |
| Ana sayfa açılıyor, alt sayfalar açılmıyor | AllowOverride kapalı; hosting panelinden açtırın |
| Adres değişti ama eski adres çalışmıyor | Yönlendirme kuralı ekleyin veya paneldeki yönlendirme modülünü kullanın |
| Kural değişikliği etki etmiyor | Rota önbelleğini temizleyin (engine/cache/system/) |
| "Bu adres kullanılıyor" hatası | Aynı slug mevcut; farklı bir adres parçası yazın |
Kontrol listesi
allow_alt_urlaçık veseo_typebilinçli seçildi..htaccesssunucuda var vemod_rewriteçalışıyor.- HTTPS geçişinde adresler karışmıyor (http/https tek biçim).
- Eski adreslerden yenilerine yönlendirme tanımlı.
- Sitemap adresleri (
sitemap.xml) erişilebilir. - Ek alan araması ve etiket sayfaları da SEF biçiminde çalışıyor.
Sırada: Akıllı Telefon Desteği.