PHP / MySQL / .htaccess ile Arama Motorlarının ve Ziyaretçilerin Anlayacağı Şekilde URL Yapılandırması (SEF URL), HEADER ve FOOTER MasterPage Kodlamak

Uğur GELİŞKEN
7 min readDec 29, 2021

--

Bir sayfa adresi, yani URL en basit hali ile tasarlanmalı. Yani o URL’ye bakan bir insan bu sayfanın içinde neler var az çok anlayabilmeli. Mesela şu iki linki inceleyin… http://www.ugurgelisken.com/index.php?id=123&sub=23467 http://www.ugurgelisken.com/kitaplar/mobil-oyun-programlama/ Veya http://www.ugurgelisken.com/kitaplar/mobil-oyun-programlama/index.html Gördüğünüz gibi ikinci olan URL daha anlaşılır bir yapıdadır. Birinci link yapısını PHP veya ASPX gibi sunucu taraflı dillerle sayfa programlayanlar, tek bir sayfa üzerinden (master page) URL’den parametreler alarak sayfaların içeriklerini veritabanından çeker. İkinci yapıda ise genelde statik olan web sayfaları programlayan kişiler daha çok kullanır (eskiden öyleydi). Bu kullanımda kitaplar klasörü içinde yer alan mobil-oyun-programlama adlı alt klasör içindeki index. çağırılıyor gibi görünüyor, ancak öyle değildir. Kafanız karışmasın. İkinci linkte görüldüğü gibi alt dizinler şeklinde bir tanımlama yapılmış ve daha anlaşılır bir mantık kurulmuş. Fakat görüldüğü gibi web sunucusunda kitaplar altında mobil-oyun-programlama diye bir klasör bulunmamaktadır. Bu mantıkla ilk URL ve ikinci URL’yi birbiri ile eşleştirelim. Eşleştirme sonucunda id değişkenimizin değeri kitaplar, sub değişkenimizin değeri de mobil-oyun-programlama olmaktadır. Yani ikinci URL’de aslında değişken atamaları yapılıyor. Değerleri ayırmak için de / operatöründen faydalanılıyor. Şimdi bu mantığı bir örnek üzerinde inceleyelim. Kitapta az çok PHP ile programlamayı gördük. Bu tür URL kısaltmaları yapma işlemine SEF URL denmektedir. SEF URL de bir çeşit illüzyondur, yani aslında öyle bir adres olmamasına rağmen web sitemiz 404 hatası vermiyor ve kullanıcının görüntülemek istediği içeriği sunuyor. Biz de PHP ile basit bir SEF URL yapısı inceleyelim. SEF URL yapısını inceleyebilmemiz için basitinden bir web içeriği oluşturalım. Öncelikle Cpanel’den bir veritabanı oluşturalım. MySQL Databases butonuna tıklayın.

Açılan sayfada veritabanı adını girin. Benim domainimde ugurgelisken.com olduğu için ilk birkaç harfi sabit alıyor. Siz de ona göre _sefurl yazın. Create Database butonuna tıklayın, yeni açılan sayfada onaylayıp geri dönün. Daha sonra veritabanı için Add a New User kısmında bir kullanıcı (ugurgeli_ugur) ve kullanıcı şifresini girip, Create a User butonuna tıklayıp oluşturun. Oluşturma işleminden sonra sayfada kullanıcı adı User listesinde görünecek. Bu kullanıcıyı Add butonuna tıklayarak veritabanı için yönetici yapın. Açılan sayfada tüm yetkileri seçip onaylayarak, kullanıcıyı tam yetkilendirin.

ugurgeli_sefurl şeklinde veritabanımızı oluşturduk. Cpanel’e tekrar geri dönün (sayfanın sol üst köşesinde yer alan ev ikonuna tıklayarak) ve phpMyAdmin butonuna tıklayın. Üst menüden SQL sekmesine girin ve aşağıdaki kodları yazıp Git butonuna tıklayın.

CREATE TABLE IF NOT EXISTS `sefurltest` (
ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
SAYFA_BASLIGI varchar(70) NOT NULL UNIQUE,
SAYFA_ICERIGI text CHARACTER SET utf32 NOT NULL,
SEFURL varchar(150) NOT NULL
) ;

Görüldüğü gibi sefurltest şeklinde bir tablo ismi, ID (Primary Key), SAYFA_BASLIGI, SAYFA_ICERIGI, SEFURL şeklinde de sütun başlıklarını oluşturdum. Şimdi de biraz içerik girelim…

INSERT INTO sefurltest (SAYFA_BASLIGI, SAYFA_ICERIGI, SEFURL) 
VALUES ("Ana Sayfa", "Sitemizin ana sayfasına hoşgeldiniz", "ana-sayfa");
INSERT INTO sefurltest (SAYFA_BASLIGI, SAYFA_ICERIGI, SEFURL)
VALUES ("Hakkımızda", "Bu sayfada size biraz kendimizden bahsedeceğiz...", "hakkimizda");
INSERT INTO sefurltest (SAYFA_BASLIGI, SAYFA_ICERIGI, SEFURL)
VALUES ("İletişim", "Merhaba. ugurgelisken@gmail.com adresinden bana yazabilirsiniz", "iletisim");

SEFURL tablosunda link isimlerini verirken Türkçe karakter kullanmamaya çalışıyoruz. Bazen bazı sayfalarda linklerin içinde Türkçe karakterler kullanıldığını görmüşsünüzdür. İsterseniz o şekilde de yapabilirsiniz ama ek olarak GET ile almış olduğunuz (birazdan kodlar içinde göreceksiniz) Türkçe karakterli bağlantı adresinden Türkçe karakterleri ayıklayıp İngilizce karakterler ile değiştirmelisiniz. Yani adresteki sayfa/iletişim bağlantısı yerine sayfa/iletisim olacak şekilde yeniden düzenlemeniz gerekecek.

Girdiğimiz veriler, aşağıdaki şekilde görüldüğü gibi tabloya işlenmiş. Sonuç itibari ile 3 farklı sayfamız ve içeriği yer alıyor. Verileri ekledikten sonra veya öncesinde tablonun karakter kodlama setini utf-8_turkish_ci olarak belirtiniz. Bunu yapmak için Düzenle butonuna tıklayıp ekranın sağ tarafındaki listeden kodlama türünü seçip kaydetmeniz yeterlidir. Normalde veriler site için bu şekilde girilmez. Daha önceki bölümlerde gördüğümüz CMS panelleri ile bu tür veriler girilir. Anca şu an SEF URL metodunu öğrenmeniz için böyle pratik bir yol üzerinden ilerliyoruz.

Şimdi de SEF URL mantığı ile link düzenleme işlemimizi PHP ile kodlayalım. Kodlarımı yazarken kendi sunucumda IP üzerinden yazdım. Yani herhangi bir domain yönlendirmesi yok. Yani http://195.142.1.243/~ugurgelisken/ yazan yere, kendi test doman’inizi yazmanız gerekmektedir, kafanız karışmasın. İlk olarak adres bağlantılarını yönetecek olan htaccess dosyamızı hazırlayalım. Herhangi bir metin editöründe aşağıdaki kodları yazın ve *.htaccess uzantısı ile kaydedin.

Options +FollowSymLinks
RewriteEngine On
RewriteRule ^sayfa/([a-zA-Z0-9]+)/$ /~ugurgelisken/sayfagetir.php?sayfa=$1 [L1]

Bu kod yapısında sayfagetir.php isminde bir PHP dosyamız var. Bu dosyaya ise sayfa adında bir değişken ile değer gönderiliyor. Bu değer, URL’den alınan parametredir. Bir veri ayıklama deseni (RegExp) ile değer elde ediliyor. Ziyaretçilerin gördüğü adres şu şekildedir: http://www.ugurgelisken.com/sayfa/ana-sayfa http://195.142.1.243/~ugurgelisken/sayfa/ana-sayfa Ancak bu adres .htaccess içinde yer alan kodlar sebebiyle şu şekle dönüşür. http://www.ugurgelisken.com/sayfagetir.php?sayfa=ana-sayfa http://195.142.1.243/~ugurgelisken/ sayfagetir.php?sayfa=ana-sayfa Görüldüğü üzere /sayfa/ adres gruplamasını siliyoruz ve sonundaki değeri parametre olarak alıyoruz. Hazırladığınız .htaccess dosyasını FTP programı aracılığı ile sunucunuzun kök dizinine, yani public_html dizinine atın. Şu aşamada sunucumuzda veritabanında 3 sayfalık verimiz var ve .htaccess yapılandırmamızı yaptık. Şimdi de veritabanındaki verilere göre basit bir menü yapmamız gerekiyor. Menü içerisinde sayfanın ismi ve sayfa ismine ilişkilendirilmiş olan linkler yer alacak. Örneğimizi yaparken en sade hali ile yapıyoruz. Yani herhangi bir CSS veya Framework kullanmayacağız. Dileyenleriniz mantığı iyice kavradıktan sonra tasarım üzerinde geliştirmeler yapabilir ve uygulamayı detaylandırabilir. Veritabanındaki verilere göre menümüz şu yapıda olacak: Ana Sayfa | Hakkımızda | İletişim Şimdi bu menümüzü oluşturalım. Menüyü, daha doğrusu ana sayfayı oluşturmak için bir index.php sayfası oluşturacağız. Kodlar içinde yer alan açıklama satırlarını inceleyip kodların işleyişi hakkında düşününüz. Kod yapımız aşağıdaki gibidir: index.php

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Language" content="TR"/>
</head>
<body>
<b>MENÜ</b>
<hr />
<?php

# PHP AÇILIŞ
# Veritabanı için gerekli olan bilgiler:
/* Sunucu adı, veritabanı kullanıcı adı, veritabanı kullanıcı şifresi, veritabanı adı, veritabanı tablo ismi. */

$host = "localhost";
$user = "ugurgeli_ugur";
$pwd = "okspelial";
$db = "ugurgeli_sefurl";
$tablo = "sefurltest";

# conn adında bir değişken ile veritabanına bağlanıyoruz.
# veritabanına bağlanılırsa true sonucu bu değişkene atanacak.
# eğer veritabanına bağlanılamazsa hata sonucu ekranda yazdırılacak.

$conn = mysql_connect($host,$user,$pwd) or die("Veritabanı bağlanma hatası " .mysql_error());

# veritabanına bağlandıktan sonra tablo seçilmeli.

mysql_select_db($db) or die("Tablo seçilmedi ".mysql_error());

# PhpMyAdmin'de veritabanı karakter setini belirlemiştik.
/* ancak olası bir karakter sorunu ile karşılaşmamak için tekrar karakter setlerini düzenliyoruz. */

mysql_query("SET NAMES utf8");
mysql_query("SET CHARACTER SET utf8");
mysql_query("SET COLLATION_CONNECTION='utf8_general_ci'");
# bir sorgu oluşturuyoruz.
# bu sorgu ile tablodaki tüm verileri çekiyoruz.
# çektiğimiz verileri veri değişkenine aktarıyoruz.

$veri = mysql_query("select * from $tablo");
# eğer sorgu sonucunda satır sayısı 0'dan fazlaysa...
# yani veri varsa...

if(mysql_num_rows($veri)!=0)
{
# bir while döngüsü ile veriler değişkenden satır satır okunuyor.
# okunan her satır değeri okunan değişkenine aktarılıyor.

while($okunan = mysql_fetch_assoc($veri))
{
# menüdeki butonları oluşturacak linkler hazırlanıyor.
/* okunan değişkeninden SEFURL ve SAYFA_BASLIGI sütunlarına ait değerler çekiliyor. */
# elde edilen değerlerle linkler oluşturuluyor.

echo "
<a href='/~ugurgelisken/sayfa/".$okunan["SEFURL"]."'>"
.$okunan["SAYFA_BASLIGI"]."</a><br><br>";
}
}else{
# eğer veri bulunamazsa verinin bulunmadığını sayfada yazdırıyoruz.
echo "İçerik bulunamadı!";
}

# veritabanı ile bağlantıyı kapatıyoruz.
mysql_close($conn);

# PHP KAPANIŞ

?>
</body>
</html>

Yazdığımız kodlara göre veritabanından veriler çekili menü oluşturulacak. Sonuç aşağıdaki gibi olacaktır:

Hazırlamış olduğumuz linklere göre bağlantılarımızın orijinal halleri şöyledir: http://195.142.1.243/~ugurgelisken/sayfa/ana-sayfa http://195.142.1.243/~ugurgelisken/sayfa/hakkimizda http://195.142.1.243/~ugurgelisken/sayfa/iletisim Bu yazdırmış olduğumuz URL’lerin hiçbiri çalışmıyor. Linkleri tıkladığımızda sayfa bulunamadı hatası gelecek:

404 Not Found
The server can not find the requested page:
http://195.142.1.243/~ugurgelisken/sayfa/ana-sayfa (port 80)
Please forward this error screen to 195.142.1.243's WebMaster.
Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips mod_bwlimited/1.4 Server at 195.142.1.243 Port 80

Veritabanı yönetimi konusunu daha önceki bölümlerde işlerken MySQLi kullanmıştık. Bu bölümde bilerek MySQL kullanımına yer verdim. Böylece iki farklı veritabanı sisteminin farklılıklarını görüp kullanım metotlarını birbiri ile karşılaştırabilirsiniz. Şimdi işin asıl kısmında geliyoruz… Şimdi .htaccess dosyasında tanımlamış olduğumuz (RewriteRule ^sayfa/([a-zA-Z0–9]+)/$ /~ugurgelisken/sayfagetir.php?sayfa=$1 [L1]) sayfagetir.php dosyamızı kodlayalım… sayfagetir.php

<?php# veritabanı bağlantı bilgileri$host = "localhost";
$user = "ugurgeli_ugur";
$pwd = "okspelial";
$db = "ugurgeli_sefurl";
$tablo = "sefurltest";
# URL'den gelen sayfa değişkeni parametresi sefurl_parametre değişkenine aktarılıyor
# Yani http://195.142.1.243/~ugurgelisken/sayfagetir.php?sayfa=ana-sayfa
# Böyle bir adreste sayfa değişkeni değeri ana-sayfa'dır.
$sefurl_parametre = mysql_escape_string($_GET['sayfa']);# HTML5 sayfasını oluşturuyoruz.
# echo ile sayfanın kodlarını PHP içinde yazdırıyoruz.
# Tek satırda da yazdırabilirsiniz ama alt alta daha düzenli olur.
echo "<!DOCTYPE html>
<html>
<head>
<meta charset=\"utf-8\">
";

# veritabanına bağlanılıyor...
$conn = mysql_connect($host,$user,$pwd) or die("Veritabanı bağlanma hatası ".mysql_error());# tabloya bağlanılıyor...
mysql_select_db($db) or die("Veritabanı seçilmedi".mysql_error());
# sorgu sonrası gelen verilerde Türkçe karakter bozukluklarını düzenliyoruz...mysql_query("SET character_set_results=utf8");# değişken tanımlıyoruz ve sorguya göre gelen değeri alıyoruz.
# sorgumuzda anahtar parametremiz GET ile URL'den aldığımız sayfa değişkeni değeridir.
# yukarıdaki örneğimizde ana-sayfa'dır.
# böylece sadece tek bir sayfanın değerleri alınacak.
$sayfa_sorgu_sonucu =
mysql_query("SELECT * FROM sefurltest WHERE SEFURL='$sefurl_parametre'");
# eğer sonuç boş değilse...
# sayfayı bir biçimde yazdırmamız gerekiyor.
# biçim olarak ana başlık h1 etiketi ile sayfada ortalı.
# ardından hr etiketi ile yatay bir çizgi çekiyoruz.
# sayfa metni justify text ile yazdırılacak.
# sayfa bağlantısı da sayfanın en altında gösterilecek.
# ayrıca sayfa bağlığına göre <title> tekrar düzenlenecek.
if(mysql_num_rows($sayfa_sorgu_sonucu)!=0)
{
while($okunan = mysql_fetch_assoc($sayfa_sorgu_sonucu))
{
# <title> etiketi ile sayfa başlığı düzenleniyor.
# sonra da <head> etiketi kapatılıp <body> etiketi açılıyor.
# body etiketi içinde de sayfa yazdırılıyor.
echo "<title>".$okunan["SAYFA_BASLIGI"]."</title>
</head>
<body>
";
# Sayfa başlığı
echo "<div align='center'><h1>".$okunan["SAYFA_BASLIGI"]."</h1>
</div><br><hr />";
# Sayfa içeriği
echo "<div align='justify'>".$okunan["SAYFA_ICERIGI"]."</div><br>";
# Sayfa bağlantı adresi
echo "Sayfa adresi:
<a href='/~ugurgelisken/sayfa/".$okunan["SEFURL"]."'>Sayfaya gitmek için tıklayın</a>";
}
# sonuç boşsa...
}else{
# sayfa bulunamadığı için hata kodu verdiriyoruz.
echo "404 Sayfa bulunamadı!";
}
# veritabanı bağlantısı kapatılıyor.
mysql_close($conn);
?></body>
</html>

Evet, işte hepsi bu kadar! Sonuçları analiz edelim… Hakkımızda sayfası:

Diğer sayfalar da bu yapıya göre çalışacaktır.

--

--

Uğur GELİŞKEN

Full-stack Developer [ UI / UX | JAM Stack | ME(A,R,V)N | LAMP ], Author, Pro Gamer