HOWTO: .htaccess + mod_rewrite + RewriteCond + RewriteRule + regex

поясню пример:
RewriteRule [^/.]/feed urllist.txt

мы имеем регулярное выражение в левой части: [^/.]/feed
и выражение замены url в правой: urllist.txt В квадратных скобках стоит character set, т.е. набор символов.
Набор (сам по себе) обозначает один единственный символ.
Символы внутри набора задают правило, которому должен соответствовать символ.
Крышка, поставленная вначале набора означает, что набор соответсвует любому символу, кроме перечисленных в наборе после крышки.
Т.е., в данном примере, это любой символ кроме слэша или точки.
Следовательно перенаправление на urllist.txt будет всякий раз когда на конце встречается /feed, за исключением двух случаев:
когда на конце //feed (например http://feed)
и когда на конце ./feed (например ../feed) А теперь рассмотрим стандарное дрюпаловское RewriteRule:
<IfModule mod_rewrite.c>#если включен mod_rewrite
  RewriteEngine on      #включить движок Rewrite
  RewriteCond %{REQUEST_FILENAME} !-f #применять RewriteRule, только если запрашиваемое имя файла не совпадает с именем какого-нибудь реального файла на сервере
  RewriteCond %{REQUEST_FILENAME} !-d #и не совпадает с именем какой-нибудь реальной директории
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA] #а вот это правило рассмотрим подробнее ниже
</IfModule>

Левая часть: ^(.*)$
Крышка вначале означает начало строки.
Бакс в конце означает конец строки.
Точка в скобочках означает любой символ.
Звездочка после точки означает, что любых символов может быть от нуля до бесконечности.
Скобочки означают группу. Т.к. она первая (и единственная), то эта группа идет под номером 1. Правая часть: index.php?q=$1
означает, что мы перезаписываем url на index.php?q= и к этому добавляем первую группу $1, т.е. имя запрашиваемого файла. Немного о точках и крышках.
В первом примере точка обозначала точку, потому что она была внутри набора символов.
Во втором примере точка обозначала любой символ, потому что она была вне набора символов.
В первом примере крышка играла роль оператора исключения.
Во втором примере крышка обозначала начало строки. Флаги [L,QSA]
цитата с http://www.egoroff.spb.ru/portfolio/apache/mode_rewrite.html, которую порекомендовал Alex:
'last|L' (последнее правило)
Остановить процесс преобразования на этом месте и не применять больше никаких правил преобразований. Это соответствует оператору last в Perl или оператору break в языке C. Используйте этот флаг для того, чтобы не преобразовывать текущий URL другими, следующими за этим, правилами преобразований. 'qsappend|QSA' (query string append - добавлять строку запроса)
Приплюсовать то, что идет после знака вопроса. Например, если урла была такая, http://mysite.com/node/1?size=_original, то в броузере останется такой-же, но скрипту пойдет в таком виде: http://mysite.com/index.php?q=/node/1?size=_original Кстати, Алекс советовал менять урлы не в .htacess, а через conf_url_rewrite(), правда в v.4.7.* этой функции нет, поэтому лучший способ - прислушаться к совету Гарамонда и подправить модуль pathauto, который в пятой версии друпала будет в стандартом дистре. А теперь, что касается поставленных задач:
1. добавить .html ко всем ссылкам
Ответ: если это сделать через .htaccess+mod_rewrite, то ссылки дрюпал всё-равно будет выдавать без .html, хотя открытые странички будут красоваться с .html в конце адреса. Это называется внешний редирект (о котором узнает броузер).
Поэтому лучше использовать pathauto, как посоветовал garamond. 2. изменить node на что-нибудь другое (интересно, а зачем Вам это нужно?). Собственно почти ни чем объективно не отличается от первой задачи, за исключением одной важной мелочи.
Но давайте поупражняемся с RewriteRule. Заменим node на girl.
<IfModule mod_rewrite.c>
  RewriteEngine on
 
  RewriteRule ^girl/(.*)$ node/$1
 
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>

набираем в броузере http://mysite.com/girl/1 и любуемся - нам отобразился 1-й узел! но толку от этого мало, ведь все ссылки в друпале остались вида node/1 и если мы щелкнем по одной из них, то опять увидим node/1 в строке адреса.
Как же сделать, чтобы отображалось girl/1 ?
Переписать из node в girl с флагом
 (внешний редирект) RewriteRule ^node(.*)$ /girl$1 [R,L] Собственно с таким рулем пути типаhttp://mysite.com/node/1 будут переделвываться в http://mysite.com/girl/1. Но при этом мы не увидим 1-й узел, вместо него мы увидим главную страницу. Это потому что дрюпал не получил поле 'q'. Следовательно надо добавить директиву RewriteRule, которая будет переделывать из girl/1 в ?q=node/1, но это не должно отобразиться в броузере:
[PATCH]<IfModule mod_rewrite.c>
  RewriteEngine on
 
  RewriteCond %{REQUEST_FILENAME} node.*
  RewriteRule ^node(.*)$ /girl$1 [R]
 
  RewriteCond %{REQUEST_FILENAME} girl.*
  RewriteRule ^girl(.*)$ index.php?q=/node$1 [L,QSA]
 
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !node.*
  RewriteCond %{REQUEST_FILENAME} !girl.*
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
</IfModule>

Можно нас поздравить, теперь 'ненавистный' node не увидишь в строке адреса, на его месте красуется girl. Однако все ссылки drupal генерит с node! Их видно в строке состояния, в исходном тексте и т.д. Не говоря уже о том, что .htaaccess добавил нагрузку на сервер! Мы проделали этот трюк исключительно для изучения mod_rewrite, реально так изменять ссылки не рекомендуется, ведь можно же подправить модуль pathauto.
Теги:
HOWTO, htaccess, mod_rewrite, RewriteCond, RewriteRule, regex
Добавлено: 15 Августа 2013 11:04:00 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...