ЧПУ на mod_rewrite
Я уже разбирал в своё время, как сделать ЧПУ-ссылки. Но в некоторых более простых случаях ЧПУ-ссылки можно сделать через mod_rewrite. Вот об этом я расскажу в этой статье, а также покажу пример реализации подобного механизма.
Предположим, что Ваши ссылки имеют следующий вид:
http://mysite.ru/?view=article&id=1
http://mysite.ru/?view=article&id=2
http://mysite.ru/?view=article&id=3
А Вы хотите сделать их вот такими:
http://mysite.ru/article/1
http://mysite.ru/article/2
http://mysite.ru/article/3
Очевидно, что второй вариант проще, короче и, самое главное, будет лучше индексироваться поисковыми системами. Теперь разберём, как это можно сделать через mod_rewrite:
RewriteEngine on
RewriteRule ^.*article/(.*)$ index.php?view=article&id=$1
Здесь мы написали правило по которому, если запрашиваемый URL удовлетворяет регулярному выражению "^.*article/(.*)$" (например, такой URL пройдёт "http://mysite.ru/article/2"), то сделать "перенаправление" вот на этот адрес "index.php?view=article&id=$1", где $1 - содержимое первой (в нашем примере и единственной) группирующей скобки в регулярном выражении.
Обратите внимание, что "перенаправление" я указал в кавычках, поскольку для пользователя никакого перенаправления не происходит. У него URL в адресной строке никак не меняется, а остаётся прежним. А вот обращение происходит не к директории article и поддиректории 2, а к файлу index.php с соответствующим GET-запросом. Поэтому несмотря на отсутствие в URL из адресной строки браузера всяких GET-параметров, если выполнить в index.php следующий код:
<?php
print_r($_GET);
?>
То Вы увидите вот это: "Array ( [view] => article [id] => 1 )". А дальше уже, думаю, понятно, что делать с этими входными данными.
В данной статье я показал, как делаются ЧПУ-ссылки на mod_rewrite. И обратите внимание, что это лишь обработка входящего URL. И ещё надо, чтобы на страницах все ссылки были именно ЧПУ. И чтобы это сделать, их тоже нужно заменять, и здесь без PHP никак не обойтись. Если вдруг Вы не знаете, как заменять обычные ссылки на ЧПУ, то настоятельно рекомендую пройти этот курс.
-
- Михаил Русаков
Комментарии (7):
Также нужно запрещать доступ к неЧПУ ссылкам, а то получится дублирование.
Ответить
До речі, є інструмент що переробить це для nginx: http://winginx.com/ru/htaccess
Ответить
В платном уроке "PHP/MySQL" при создании движка как раз такой формат URL: http://test/?view=article&id=1 Включаю .htaccess - ноль реакции. Почему? Что-то в Денвере менять?
Ответить
Уважаемый Михаил, объясните пожалуйста, для чего в строке RewriteRule ^.*article/(.*)$ index.php?view=article&id=$1 стоят символы ".*" перед "article". Насколько я понимаю, часть пути перед словом article автоматически должна быть путём к папке, где лежит данный файл .htaccess
Ответить
Решил сделать ЧПУ ссылки через mod_rewrite и написал такое правило: RewriteEngine On RewriteRule ^(.*)/(.*)$ index.php?p=$1&g=$2 [NC,L], параметры передаются , а вот стили перестали подгружаться на сайт! Скажите Михаил, из-за чего это может быть? Если вам не трудно напишите верное правило. Спасибо!
Ответить
Подобрал правило, и написал так: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)/(.*)? index.php?p=$1&g=$2 [QSA,NC,L] , теперь при загрузке сайта стили подгружаются, а картинки не грузятся. Что у меня не так? Подскажите кто знает, что надо еще сделать с правилом?
Ответить
У меня были такие же проблемы: CSS не подгружается. Решение такое: 1) Добавляем строку для параметров RewriteRule ^.*articleblog/(.*)$ articleblog?id=$1 [QSA] 2) В ссылке на файл стилей в заголовке <link rel="stylesheet" href="/styles/main.css" type="text/css" /> должно быть "/styles/main.css" а не "styles/main.css" (см./www.phpinfo.su/articles/practice/chpu_na_php.html) 3) для иконок то же условие, что и для стилей: путь к иконке должен быть "/images/avatars/icon.png", а не "images/avatars/icon.png"
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.