Здравствуйте. Столкнулся с проблемой в понимании принципа работы mod_rewrite.
Статьи читал, но не много не докуриваю я это дело. Если кто может объясните пожалуйста принцип.
Опишу что я конкретно не понимаю:
Спойлер (Отобразить)CODE (
html):
скопировать код в буфер обмена
RewriteEngine on //включаем механизм
RewriteBase / //левая часть(для получения общего путя в ЧПУ)
RewriteCond %{REQUEST_FILENAME} !-d //что означает !-d(взято из статьи DeepVarvar)
RewriteCond %{REQUEST_FILENAME} !-f //что означает !-f(взято из статьи DeepVarvar)
RewriteRule ^(.*) index.php?q=$1 [L] //я так понимаю сдесь говорится, что как только ты встретишь точку читая строку сначала, подставляй index.php?q=$1 до конца строки. Но что означает [b]единица[/b] после [b]$[/b]?
И я так понимаю это не универсальный вариант. Как можно грамотно настроить ЧПУ? Что бы на основе title статьи например, формировался ЧПУ. Если можно напишите код чтоб я вбил его у себя и прощупал на примере как это работает.
301 редирект
RewriteRule ^file.php$ anotherfile.php [R=301] - все норм редиректится, но вдруг мне нужно удалять дубли если у меня настроено ЧПУ? Тоесть сайт будет доступен и так site.ru/articles/33 и так site.ru/index.php?articles=33
С точки зрения поисковиков это не есть хорошо. Поэтому думаю надо сделать 301 редирект с программных ссылок на ЧПУ ссылки. Это что каждый раз ручками нужно будет для всеъ случаев менять .htaccess? Не думаю... Хотелось бы получить грамотное объяснение как решить эти две задачи, желательно с примерами.
Заранее спасибо, надеюсь вы мне поможете )
^(.*) значит "всё", это регулярное выражение.
$1 — это ссылка на эту маску, т.е. в $1 попадёт то, что подходит под выражение (.*), т.е., как я сказал выше, всё.
!-f и
!-d значит, что выражение должно выпоняться только для того пути, который не является путем к файлу (!-
file) или директории (!-
dir). Восклицательный знак — это, как обычно, отрицание, нужно для того, чтобы пути к изображениям или файлам проходили напрямую, не через PHP.
(Добавление)
teddy пишет:И я так понимаю это не универсальный вариант. Как можно грамотно настроить ЧПУ? Что бы на основе title статьи например, формировался ЧПУ. Если можно напишите код чтоб я вбил его у себя и прощупал на примере как это работает.
Это универсальный вариант для систем с единой точкой входа.
Это правильный вариант, а ЧПУ вы должны делать уже через PHP.
Вам нужно смотреть на роутинг запросов.
Т.к. через mod_rewrite все запросы перенаправляются на index.php, то, например, при запросе
http://site.ru/news/12 в
$_GET['q'] будет
/news/12.
Соответственно, в самом PHP вы должны при помощи регулярных выражений выполнить роутинг этого адреса.
Например, чтобы получить из адреса
/news/12 ID новости (12) вам понадобится регулярное выражение типа
news/([0-9]+).
Насчет редеректов не понял, что вы имели в виду, но ЧПУ должно делаться через PHP для большей гибкости, так что эта проблема сама решится, когда разберетесь с роутингом.