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 будет иметь следущий вид:
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/
Нам будет приятно
Поделитесь
Комментарии