Человеко-понятный URL нужен. Так наглядней видеть где вы находитесь. Реализовать ЧПУ можно несколькими способами.
(Apache) mod_rewrite
В зависимости от архитектуры web-системы, загрузка отдельных модулей происходит как правило если не напрямую через GET запрос, то хотя-бы косвенно. Косвенно это когда создаётся страница, а потом специально для неё создаётся путь, сохраняется в БД, изменяем и красив.
Преобразование разных параметров в папки по-моему самое нужное. Включаем mod_rewrite, создаём или дописываем .htaccess что-бы работало всё так:
http://kurapov.name?mod=gallery&action=list&page=5
http://kurapov.name/gallery/list/?page=5
Options +FollowSymLinks
RewriteCond %{REQUEST_FILENAME} !-f
RewriteEngine On
RewriteRule ^([A-Za-z0-9^/]+)/([A-Za-z0-9_^/]+)/$ /index.php?mod=$1&action=$2 [QSA,L]
RewriteRule ^([A-Za-z0-9^/]+)/([A-Za-z0-9_^/]+)/?$ /index.php?mod=$1&action=$2 [QSA,L]
Самое главное это конечно же RewriteRule, которое построено на регулярных выражениях , поэтому многие веб-разработчики и не прошли через этот участок. В данном примере в URL ищется в начале (знак ^) две папки, названия которых состоят из букв и цифр. Первая папка становится значением $1, вторая соответсвенно $2. В итоге запрос передаётся в обработку в index.php с GET параметрами. Параметр QSA=query string append добавляет в конец ещё параметры которые запрашивал пользователь.
Установка ЧПУ на существующую систему
Какой получается минус? Если есть файл resources/thumbs/generator.php , то получится что обращение тоже будет перезаписываться, и в действительности будет всё идти на index.php. Более того, если система была спроектирована по относительным путям, где все картинки, фреймы, ссылки не велись от корня, то возникнет проблема с новой адрессацией.
404 перезапись
Как очень быстрое и простое решение можно вместо mod_rewrite использовать перенаправление 404 ошибки
ErrorDocument 404 /index.php
Теперь достаточно в index.php обратится к массиву и вызвать нужный модуль:
header("HTTP/1.1 200 OK");
header("Status: 200 OK");
$arrURL=explode('/',$_SERVER['REQUEST_URI']);
Не забудьте проверять существует ли такой модуль в системе, и сделать обработку ошибок, в том числе и на уровне header-ов, иначе поисковики могут посчитать что у вас всюду брак.
Комментарии
RewriteEngine on RewriteBase / RewriteRule .* index.phpВ index.php разбирать QUERY_STRING
RewriteEngine on Options +FollowSymLinks RewriteBase / RewriteRule ^.htaccess$ - [F] RewriteCond %{REQUEST_FILENAME} !\.(jpg|jpeg|gif|png|css|js|pl|txt)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /index.php [QSA]site.ru/catalog/proc/intel -> index.php
site.ru/catalog/ -> index.php
т.е. все что только можно ссылалось на index.php
делаю так:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !\.(jpg|jpeg|gif|png|css|js|pl|txt)$ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([A-Za-z0-9/-]+)/?$ index.phpРеврайт на index.php РАБОТАЕТ, но css, картинки, скрипты не грузятся.
т.е. у них адрес остается http://site.ru/catalog/proc/themes/logo.png
при запросе site.ru/catalog/proc/
(картинки в /themes относительно корня)
нужно было к путям картинок, стилей, скриптов дописать в начало слэш, т.е:
было: src="inc/jquery-1.3.1.min.js"
стало: src="/inc/jquery-1.3.1.min.js"
также картинки:
< img src="/themes/logo.png"/>
все гениальное просто :-)
также картинки:
src="/themes/logo.png"
P.S. можно было еще через
Это же не ЧПУ. Одностороннее ЧПУ получается, ссылки красивые создавать можно, но в адресной строке в итоге все равно будет треш.
LoadModule rewrite_module modules/mod_rewrite.so AddModule mod_rewrite.c ClearModuleList(или .dll) и перезапустив сервер
Теперь все почти как надо, но у меня меняется document_root и файл style.css который лежит в корне, рядом с index.php не находится. если на него ссылку сделать например как ../../style.css то находиться и стили начинают работать. количество переходов вверх зависит от кол-ва слешей (уровней) в красивом урле. вот теперь это надо грамотно зарешать и можно жить. но я чувствую тут будет большой геморой, как бы не пришлось все пути в include файлах менять. к картинкам, к css, к .js. а степень вложенности урла будет меняться, т.е. "../../" часть надо определять переменной в php и подставлять в инклюдируемый шаблон перед именем файла. так работает, но это не правильно, не тру.
RewriteCond %{REQUEST_FILENAME} !-fOptions +FollowSymlinks RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteEngine on RewriteRule ^([A-Za-z0-9^/]+)/?$ /index.php?mod=$1 [QSA,L] RewriteRule ^([A-Za-z0-9^/]+)/([A-Za-z0-9_^/]+)/?$ /index.php?mod=$1&action=$2 [QSA,L] ErrorDocument 404 /index.phpВот при таком содержимом все равно не подхватывается styles.css. Причем при ссылке типа http://mydomain.ru/wer стили все таки подхватываются, а при http://mydomain.ru/wer/ (со слешем в конце) или http://mydomain.ru/wer/asa/ или http://mydomain.ru/wer/asa или любой другой пример дальше по вложенности уже не подхватывается.
в index.php у меня есть include("template.php") в темплейте