Поддиректория вместо GET променлива?

dreamteck

Registered
Окей! Въпросът ми е много глупав и много основен.
Напоследък ми прави все повече и повече впечатление, как някои сайтове използват в URL-ите си поддиректории вместо да имат променливи.

Пример за това е Фейсбук, в който можете да си напишете нещо като никнейм и после всички могат да ви достигнат посредством този никнейм:

facebook.com/nickname

Или разни галерии в интернет. Вместо да имат гет променлива:

gallery.com/?view=1234

Те директно използват: gallery.com/1234

или пък gallery.com/view/1234


Интересно ми е как се прави това нещо с PHP и изобщо с PHP ли се прави или е по някакъв друг начин.

Съжалявам отново за глупавата тема, не знам какво да търся в интернет :D

Поздрави!
 
1. Пускаш си mod rewrite от apache.
2. Във главната директория на сайта ти (там където е index.php), правиш нов файл: .htaccess (без име, само разшерението). Във него слагаш следното:

Код:
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

3. Сега като влезнеш във папката на сайта (където е този .htaccess), всичко каквото пишеш във URL, ако не е директория или файл ще го препраща към index.php

4. Пример:

<?php
$url = $_SERVER['REQUEST_URI'];
?>

Сега тази променлива $url ти държи цялото въведено URL, сега посредством explode(); си разделяш url - то и си използваш въведените неща.

Въвели сме примерно localhost/galery/12/

PHP:
<?php 
$url = $_SERVER['REQUEST_URI'];

$url = explode('/', $url);

/** Просто премахваме празните елементи от масива (преди и след наклонената черта) */
$url = array_filter($url);

/** Тук казваме, че първия елемент от url - то примерно е някой файл */
$file = $url[0];

/** Тук казваме, че втория елемент е примерно ID на снимка */
$id = $url[1];

/** Правим една заявка към базата данни примерно, че въведеното число във URL - то е ID на снимка */

$row = mysql_query("SELECT link FROM img WHERE id = $id");

echo '<img src="'.$row['link'].'" />';

?>


Още едно нещо, тъй като ти се препраща към index.php, там може да направиш един dispatcher, който според това какво си въвел да ти инклулдва коректния файл.

Горният пример ще стане:

include $file.'.php';

Тоест да ти инклудне файла galery и вече във него да си съставяш логиката от другите елементи от урл - то. То това общо взето се използва за MVC модела. Разделя се URL - то на 3: controller, method and values.

Да добавя още, ако сайта ти се намира във някоя папка, а не директно във www папката, тогава за да изкараш какво си въвел във URL - то може да използваш примерно една такава функция:

PHP:
function getUrl() {

$url = $_SERVER['REQUEST_URI'];
$base = dirname($_SERVER['PHP_SELF']);

if(strlen($base) > 0) {
            $url = substr($url, strlen($base));
  }

$values = explode('/', $url);

$values = array_filter($values);

return $values;
}



ЕДИТ:

Може би те обърках с горния код. Този код горе е полезен ако искаш да имаш front controller ...

При теб може да направиш нещатата така:

Във .htaccess пишеш само

Код:
RewriteEngine on
RewriteRule ^galery/([^/.]+)/?$ galery.php?id=$1 [L]

Линка за достъп до galery.php?id=5 като както горния пример, id ще е id на снимка във базата данни.

Сега, попринцип за достъп до тази страница трябва да напишеш:
http://localhost/galery.php?id=5

обаче rewrite като види такъв линк, автоматично валидира и този линк да бъде правелен:
http://localhost/galery/5

И 2 та линка ще имат еднакъв резултат.

Важно: Щом работиш със .htaccess винаги работи със абсолютни пътища.
Тоест не <a href="galery/5/">Pic</a>, ами ще стане:
<a href="http://localhost/galery/5/">Pic</a>

За да достъпиш числото 5 от url - to, може да си използваш: $_GET['id'];, при този начин за преправяне не url, не е нужно да използваш $_SERVER за достъп до елементите.
 
Благодаря ти за пълния отговор. И на мен ми се струваше, че ще се прави с Rewrite, но не бях никак сигурен. Разбрах те напълно, но това, което ме обърка беше втория пример.

при мен положението е следното:

имам директория сайт/profile/index.php

от там, за да взема даден потребител по име правя

сайт/profile/index.php?name=potrebitel (принципно не изписвам index.php)

Ако използвам първия начин, трябва в htaccess да окажа файла index.php в директория profile и след това може линкът да се сведе до сайт/profile/potrebitel

А ако използвам втория вариант, трябва да имам включено и name -> сайт/profile/name/potrebitel

Защото това всъщност е просто нещо като трик за заместване на символи, но самио значение на контента си остава по един или друг начин, нали ?

Само ми кажи дали съм те рабрал правилно :)
 
Първият пример не го гледай за сега. Него може да го използваш ако желаеш да имаш една входна точка за целият сайт. Тази входна точка трябва да играе ролята на разпределителен център (г/д), но това май нямаше много общо със твоят въпрос и за това се поправих със вторият пример.

Код:
RewriteEngine on 
RewriteRule ^user/([^/.]+)/?$ profile/index.php?name=$1 [L]

Нормалния линк изглежда така:
http://localhost/profile/index.php?name=az

Тъй като вече сме сложили rewrite и както сам казваш - вече сме залъгали сървъра. Той почва да отговаря на:
http://localhost/user/az/

Двата линка са абсолютно еднакво валидни.

Сега за да вземеш ID във profile/index.php, си го правиш по старомодния начин със:
PHP:
$_GET['name'];

Само да добавя отново: винаги ползвай абсолютни пътища във сайта. Единствено само във .htaccess не е нужно.

Да и вече самите линкове по сайта ти си ги преправи във новия вид да са:
http://localhost/home/ вместо примерно index.php.
 

Back
Горе