Rehber PHP PHP & .htaccess ile Seo Uyumlu Link Yapısı (SEF URL)

dgknbzglu

Kilopat
Katılım
5 Mart 2019
Mesajlar
1.434
Çözümler
52
Yer
İstanbul/Maltepe
Daha fazla  
Cinsiyet
Erkek
Meslek
PHP Developer
Merhabalar, elle tutulur bir makale görünmüyordu internette. Ben de Sosyal'de rehber oluşturayım dedim.
Öncelikle ne yapacağımızı göstereyim.

Normalde görünen link:
Kod:
localhost/detay.php?sefurl=baslik-bir
ya da
Kod:
localhost/detay.php?id=1
İşlemler sonrasında görünen link:
Kod:
localhost/baslik-bir

Github
Yukarıdan Github projesine ulaşabilirsiniz. SQL yedeği de projede mevcut.
Konu altında yardım taleplerinize cevap verebilirim. Kolay gelsin.

Bu içeriği görüntülemek için üçüncü taraf çerezlerini yerleştirmek için izninize ihtiyacımız olacak.
Daha detaylı bilgi için, çerezler sayfamıza bakınız.

index.php
PHP:
<?php
include ("conn.php");
?>
<!doctype html>
<html lang="tr">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <title>!</title>
  </head>
  <body>
    <div class="container">
        <div class="row">
            <div class="col-md-6 mx-auto py-5">
                <h3 class="text-center">SEFURL</h3>
         
                <?php

                     $k = $db->prepare("SELECT * FROM urunler");
                     $k->execute();
             
                     while ($cek = $k->fetch(PDO::FETCH_OBJ)) {?>
                <p class="text-center"><a href="<?=$cek->sefurl?>"> <?=$cek->baslik?> </a></p>
            <?php } ?>
            </div>
        </div>
    </div>
 
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
 
  </body>
</html>


detay.php
PHP:
<?php
include("conn.php");
$sefurl = $_GET['sefurl'];
$q = $db->prepare("SELECT * FROM urunler WHERE sefurl = ?");
$q->bindParam(1, $sefurl, PDO::PARAM_STR);
$q->execute();
$Urun = $q->fetch(PDO::FETCH_OBJ);
?>
<!doctype html>
<html lang="tr">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <title>!</title>
  </head>
  <body>
    <div class="container">
        <div class="row">
            <div class="col-md-6 mx-auto py-5">
                <h3 class="text-center">Başlık: <?=$Urun->baslik?></h3>
         
                <p class="text-center">Açıklama: <?=$Urun->aciklama?></a></p>
                <p class="text-center">Sef URL: <?=$Urun->sefurl?></a></p>
            </div>
        </div>
    </div>
 
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM" crossorigin="anonymous"></script>
 
  </body>
</html>

conn.php
PHP:
<?php
$__DBHOST = "localhost";
$__DBUSER = "root";
$__DBPASS = "";
$__DBNAME = "sef";

try {
    $db = new PDO("mysql:host=$__DBHOST;dbname=$__DBNAME;charset=utf8", $__DBUSER, $__DBPASS);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    }
catch(PDOException $e)
    {
    echo "Bağlantı hatası: " . $e->getMessage();
    exit;
    }
?>

.htaccess
Kod:
RewriteEngine on
 
# Yeni bir yönlendirme kuralı ekliyoruz
RewriteRule ^([0-9a-zA-Z-_]+)$  detay.php?sefurl=$1 [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
# Klasörlerin bu durumdan etkilenmemesi için şart ekliyoruz
RewriteCond $1 !^(css|js|images|inc|assets)
 
Son düzenleyen: Moderatör:
Bu .htaccess aslinda server container tarafinda kullaniliyor degil mi? Apache sanirim bu durumda.
PHP request dispatcherin yonlendirme yapildigindan haberi var mi?
 
Bu .htaccess aslinda server container tarafinda kullaniliyor degil mi? Apache sanirim bu durumda.
PHP request dispatcherin yonlendirme yapildigindan haberi var mi?
Bahsettiğinizi anlamadım ama htaccess ile sunucu üzerinden kullanıcı ve Google’a seo uyumlu link üretiliyor.
Ekstra olarak bilgim dışı maalesef.
 
Bahsettiğinizi anlamadım ama htaccess ile sunucu üzerinden kullanıcı ve Google’a seo uyumlu link üretiliyor.
Ekstra olarak bilgim dışı maalesef.

PHP bir web server uzerinde calisiyor. Apache, Nginx vs gibi.

Diyelim ki kullanici istek atti, bunu once webserver karsiliyor, sonra da ilgili PHP scriptini calistiriyor.

.htaccess komutu tahmin ediyorum ki PHP ye degil aslinda onu uzerinde calistiran server'a verdigimiz bir komut. Bu durumda PHP perspektifinden bakilirsa aslinda yonlendirilme yapilip yapilmadigini fark etmiyor bile olabilir.

Dogru mu dusunuyorum yanlis mi dusunuyorum bunu soruyorum aslinda :)
 
PHP request dispatcherin yonlendirme yapildigindan haberi var mi?
Direkt olarak yok, ama şöyle bir şey yapılabilir:

index.php'ye define('INDEX_ERISILDI', TRUE); yazılır. Normal trafik index üzerinden akıtılır. İndex'e uğramadan htaccess ile başka bir yere transfer erildiğinde bu değişken bulunmayacağından direkt erişim veya htaccess yönlendirmesi olduğu yorumlanabilir.

PHP'nin Apache'den ayrı olması yaratıyor aslında bunu. Full PHP bir sunucu olsa öğrenilebilirdi.
 
Son düzenleme:
Direkt olarak yok, ama şöyle bir şey yapılabilir:

index.php'ye define('INDEX_ERISILDI', TRUE); yazılır. Normal trafik index üzerinden akıtılır. İndex'e uğramadan htaccess ile başka bir yere transfer erildiğinde bu değişken bulunmayacağından direkt erişim veya htaccess yönlendirmesi olduğu yorumlanabilir.

PHP'nin Apache'den ayrı olması yaratıyor aslında bunu. Full PHP bir sunucu olsa öğrenilebilirdi.

Bence header larda bir yerlerde isareti vardir, dokumanlarini karistirmak lazim. referrer-origin, referrer vs gibi. Cunku forward ya da redirect edecegin zaman .htaccess e bakmak zorunda kalacaksan gereksiz bagimlilik yaratmis oluyorsun.

Bu metodla redirect true ya da false elde etmis olursun, orijinal olarak kullanicinin erismek istedigi uri bilgisi kaybolmus oluyor.
 
@bitwise Benim ampul yeni yandı.

Htaccess içerisinde kullanıcının parametresine ek olarak farklı bir parametre de eklenir ve bu parametre tanımlanmışsa htaccess yönlendirmesi olduğu anlaşılır. Parametreye erişilen URL de paslanabilir.

Teorik bilgi, test etmedim tabii.

.htaccess'in şöyle olması lazım:

Kod:
RewriteRule ^([0-9a-zA-Z-_]+)$  detay.php?sefurl=$1&rewrite_oncesi_url=%{REQUEST_URI} [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f

Kaynak: #htaccess List of all mod_rewrite variables
 
@bitwise Benim ampul yeni yandı.

Htaccess içerisinde kullanıcının parametresine ek olarak farklı bir parametre de eklenir ve bu parametre tanımlanmışsa htaccess yönlendirmesi olduğu anlaşılır. Parametreye erişilen URL de paslanabilir.

Teorik bilgi, test etmedim tabii.

.htaccess'in şöyle olması lazım:

Kod:
RewriteRule ^([0-9a-zA-Z-_]+)$  detay.php?sefurl=$1&rewrite_oncesi_url=%{REQUEST_URI} [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f

Kaynak: #htaccess List of all mod_rewrite variables

Bak bu mantikli. Gerci kullanici rewrite da cevirdigimiz dolaplari goruyor bu sekilde. Daha az caktirarak yapilsa daha iyi. Soyle minik bir header eklese gerektiginde gorsem.

Tesekkurler ama, soruma cevap almis oldum boylece :)
 

Geri
Yukarı