06.03.2013

Как сделать ЧПУ для сайта

(Человеко-Понятные Урлы) или SEF (англ. Search Engines Friendly url). Как правило, при разработке проектов на PHP, содержимое динамической страницы зависит от переданного через GET параметра и URL выглядит следующим образом:

yourdomain.com/index.php?id=201

в данной случае намного аккуратнее смотрелась бы ссылка вида:

yourdomain.com/201/
yourdomain.com/201.html

а ещё лучше:

yourdomain.com/name-page.html

Как это сделать? Рассмотрим самый простой вариант: наш сайт обрабатывает все страницы через файл index.php и содержимое страницы определяется только одной переменной – id. В таком случае механизм преобразования из /index.php?id=201 в/name-page.html будет иметь следущий вид:

66996_281825145280810_1206146610_n.jpg

66996_281825145280810_1206146610_n.jpg

1) Определяем существует ли запрашиваемый путь в реальности. Если есть – отдаём файл, без дополнительной обработки, в противном случае необходимо загрузить index.php, который обработает несуществующий ЧПУ. Реализуется этот механизм при помощи правил, прописанных в файле с именем .htaccess.

Файл .htaccess должен находиться в корневой директории. Создать и править.htaccess можно в обычном текстовом редакторе.

Содержимое файла .htaccess:

#ЧПУ
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

RewriteEngine On – разрешаем серверу преобразовывать URL.

RewriteBase / – устанавливаем базовый URL.

RewriteCond %{REQUEST_FILENAME} !-f – проверяем, что запрошенной директории не существует.

RewriteCond %{REQUEST_FILENAME} !-d – проверяем, что запрошенного файла не существует.

RewriteRule . /index.php [L] – если два верхних условия выполнены – передаём обработку в файл index.php

MySQL

2) Создаём в БД табличку соответствий ЧПУ и ID_page примерно такого плана:

SEF ID_page
varchar(255) int(11)
index 1
page 2
page-name 3

PHP

3) Содержимое файла index.php, из комментариев в коде ясно, как это работает.

/* Получаем URL в переменную $result в случае yourdomain.com/name-page.html в $result окажется строка: /name-page.html */
$result = $_SERVER['REQUEST_URI'];

/* проверяем, что бы в URL не было ничего, кроме символов алфавита (a-zA-Z), цифр (0-9), а также . / - _ # в противном случае - выдать ошибку 404 */
if (preg_match ('/([^a-zA-Z0-9\.\/\-\_\#])/', $result)) {
	header('HTTP/1.0 404 Not Found');
	echo 'Недопустимые символы в URL';
	exit;
}

/* отбрасываем из ЧПУ всё лишнее, оставляя только имя виртуального html-файла. В случае с  yourdomain.com/name-page.html это будет name-page функция preg_split формирует массив, разбивая переданную строку по заданной маске. */
$array_url = preg_split ('/(\/|\..*$)/', $result,-1, PREG_SPLIT_NO_EMPTY);

/* в случае, если обращение было только к домену (yourdomain.com/ или yourdomain.com), в $array_url будет пустой результат, такое событие нужно обработать, как страницу с ID_page = 1 */
if (!$array_url) {
	$ID_page = 1;
}else{
	$sef_value = $array_url[0];
/* Далее идёт запрос в БД о наличие в столбце SEF строки $sef_value при положительном ответе получаем из БД соответствующий $sef_value $ID_page, если такой строки не найдено - выводим страницу ошибки 404. */
}
/* Теперь обычная обработка, как если бы $ID_page был получен методом GET */

За подсказку спасибо http://habik.net/kak-sdelat-chpu-dlya-sajta-na-php/

Нам будет приятно

Поделитесь

Комментарии

Загрузка комментариев...