Страница 1 из 1

mod_rewrite

Добавлено: 26 июл 2011, 16:45
Raven
Наверное самый больной вопрос при использовании lighttpd - это правила для рерайта. Надеюсь нижеизложенное поможет лучше переварить эту проблему ))).

Предыстория:
Понадобилось мне как-то одна злющая CMS (злющая не в плане продвинутости а в плане капризности). Там она работала раньше стоял nginx и правила рерайта были следующими

Код: Выделить всё

            try_files $uri $uri/ /index.php?q=$uri&$args;
вот это самое try_files меня очень сильно смущало, поскольку аналогичного синтаксиса в lighttpd нет, а между тем данный синтаксис зачит буквально "просмотреть корень на предмет наличия совпадений в названиях файлов/папок, если таковых нет - передать скрипту index.php с заданными аргументами". Однако методом тыка и долгого гугления выяснилось что аналоги чный синтаксис используется для CMS Drupal. Далее погуглив на тему Lighttpd+Drupal rewrite отыскалось решение, которое смогло частично заменить цепочки рерайта и сдвинуть с места непокорную CMS. Первоначальный конфиг выглядел так:

Код: Выделить всё

url.rewrite-final = (
    "^/([^.?]*)\?(.*)$" => "/index.php?q=$1&$2",
    "^/([^.?]*)$" => "/index.php?q=$1"
  )
Итак, обратимся к документации (прошу не пинать за вольный перевод)))):

Опции

url.rewrite-once

Перезапись набора URL-адресов внутри в веб-сервера, до того, как они будут обработаны.

Например:

Код: Выделить всё

url.rewrite-once = ( "<выражение>" => "<относительный_путь>" )
для одной цепочки правил и.

Код: Выделить всё

url.rewrite-once = ( 
  "<выражение1>" => "<относительный_путь1>",
  "<выражение2>" => "<относительный_путь2>" 
)
для нескольких цепочек правил перезаписи URL.

url.rewrite-repeat

По сути то же что и предыдущая опция, но url.rewrite-once остановит дальнейшую перезапись URL, если выражение совпало, а с помощью url.rewrite-once можно использовать несколько вариантов перезаписи адресов.

Код: Выделить всё

url.rewrite-repeat =  ( "<выражение>" => "<относительный_путь>" )
Опции url.rewrite и url.rewrite-final используются так же как url.rewrite-once начиная с версии 1.3.16

url.rewrite-[repeat-]if-not-file
(Введена в версии 1.4.24)

Перезапись набора URL-адресов внутри в веб-сервера, до того, как они будут обработаны, в случае если директория сервера не содержит файлов соответствующих <выражению> в запросе.
Синтаксис аналогичен url.rewrite-once.

Регулярные выражения:

Допускается использование след. шаблонов:
  • . (точка) - заменяет любой символ
  • \* (звездочка) - ноль или больше предыдущих символов
  • \+ (плюс) - соответствует одному или нескольким предыдущим символам
  • ? (вопрос) - ноль или один из предыдущих символов
  • \\? (обратный слэш) - соответствие специальных символов
  • ^ (крышка) - соответствует началу строки
  • $ (символ доллара) - соответствует концу строки
  • [set] - соответствует совпадению с одним из символов в квадратных скобках (любым)
  • [^set] - соответствует не совпадению ни с одним из символов в квадратных скобках
  • (<шаблон>) - группировка, модель соответствует как специальная переменная
  • (?!<слово-исключение>) - переписывать все запросы кроме запросов к <слову-исключению>. Например "^(/(?!(favicon.ico$|js/|images/)).*)" => "/index.php?$1" перепишет все запросы в параметры и переадресует их скрипту index.php за исключением запросов содержащих слова favicon.ico, js, images.
Нормальные алфавитно-цифровые символы рассматриваются как обычные.

Шаблоны замены

Если соответствующее регулярное выражение содержит группы в скобках, $1...$9 то замене подлежит захваченный текст в соответствующих группах - «$1» для первой группы, "$2" для второй, и так далее.

Обратите внимание, что использование переменных с % в синтаксисе замены (например,%1,%2,%0, и т.д.) в назначении url.rewrite-* разрешено, но не имеет смысла, поскольку они используются в синтаксисе evhost.path-*.

Несколько примеров использования с популярными CMS:

PHPbb 3.0.х Ultimate Seo Mod

Код: Выделить всё

#Dlya SEO ULtimate mod rewrite for lighttpd server
url.access-deny = (".htaccess")

$HTTP["url"] =~ "^/config.php" {
    url.access-deny = ( "" )
    }
$HTTP["url"] =~ "^/common.php" {
url.access-deny = ( "" )
}
url.rewrite-once = (
"^/(Tyt ukazivaete imya vashih realnih papok primer dalee ---|Plugin|adm|ads|docs|download|gallery|images|img|includes|language|styles|tmp|phpmyadmin
)$"  => "/$1",
"^/(Tyt ukazivaete imya vashih realnih papok primer dalee ---|Plugin|adm|ads|docs|download|gallery|images|img|includes|language|styles|tmp|phpmyadmin
)/(.*)$"  => "/$1/$2",
# FORUM INDEX REWRITERULE WOULD STAND HERE IF USED. "forum" REQUIRES TO BE SET AS FORUM INDEX
"^/forum\.html$"  => "/index.php",
# FORUM ALL MODES
"^/(forum|[a-z0-9_-]*-f)([0-9]+)/?(page([0-9]+)\.html)?$"  => "/viewforum.php?f=$2&start=$4",
# TOPIC WITH VIRTUAL FOLDER ALL MODES
"^/(forum|[a-z0-9_-]*-f)([0-9]+)/(topic|[a-z0-9_-]*-t)([0-9]+)(-([0-9]+))?\.html$"  => "/viewtopic.php?f=$2&t=$4&start=$6",
# GLOBAL ANNOUNCES WITH VIRTUAL FOLDER ALL MODES
"^/announces/(topic|[a-z0-9_-]*-t)([0-9]+)(-([0-9]+))?\.html$"  => "/viewtopic.php?t=$2&start=$4",
# TOPIC WITHOUT FORUM ID & DELIM ALL MODES
"^/([a-z0-9_-]*)/?(topic|[a-z0-9_-]*-t)([0-9]+)(-([0-9]+))?\.html$"  => "/viewtopic.php?forum_uri=$1&t=$3&start=$5",
"^/([a-z0-9_-]*)/?(topic|[a-z0-9_-]*-t)([0-9]+)(-([0-9]+))?\.html\?(.+)$"  => "/viewtopic.php?forum_uri=$1&t=$3&start=$5&$6",
# PHPBB FILES ALL MODES
"^/resources/[a-z0-9_-]+/(thumb/)?([0-9]+)$"  => "/download/file.php?id=$2&t=$1",
# PROFILES ALL MODES WITH ID
"^/(member|[a-z0-9_-]*-u)([0-9]+)/$"  => "/memberlist.php?mode=viewprofile&u=$2",
# USER MESSAGES ALL MODES WITH ID
"^/(member|[a-z0-9_-]*-u)([0-9]+)/(topics|posts)/?(page([0-9]+)\.html)?$"  => "/search.php?author_id=$2&sr=$3&start=$5",
# GROUPS ALL MODES
"^/(group|[a-z0-9_-]*-g)([0-9]+)(-([0-9]+))?\.html$"  => "/memberlist.php?mode=group&g=$2&start=$4",
# POST
"^/post([0-9]+)\.html$"  => "/viewtopic.php?p=$1",
# ACTIVE TOPICS
"^/active-topics(-([0-9]+))?\.html$"  => "/search.php?search_id=active_topics&start=$2&sr=topics",
# UNANSWERED TOPICS
"^/unanswered(-([0-9]+))?\.html$"  => "/search.php?search_id=unanswered&start=$2&sr=topics",
# NEW POSTS
"^/newposts(-([0-9]+))?\.html$"  => "/search.php?search_id=newposts&start=$2&sr=topics",
# THE TEAM
"^/the-team\.html$"  => "/memberlist.php?mode=leaders",
# FORUM WITHOUT ID & DELIM ALL MODES (SAME DELIM)
"^/([a-z0-9_-]+)/?(page([0-9]+)\.html)?$"  => "/viewforum.php?forum_uri=$1&start=$3"
)
url.redirect = (
# FIX RELATIVE PATHS : FILES
"^.+/(style\.php|ucp\.php|mcp\.php|faq\.php|download/file.php)$"  => "/$1",
# FIX RELATIVE PATHS : IMAGES
"^.+/(styles/.*|images/.*)/$"  => "/$1"
) 
Wordpress

Код: Выделить всё

url.rewrite = (
 "^/(wp-.+).*/?" => "$0",
 "^/(sitemap.xml)" => "$0",
 "^/(xmlrpc.php)" => "$0",
 "^/(.+)/?$" => "/index.php/$1"
 )
Wordpress установленный в подпапку (например "blog")

Код: Выделить всё

url.rewrite = (
 "^/?$" => "/blog/index.php",
 "^/blog/(wp-.+)$" => "$0",
 "^/blog/xmlrpc.php" => "$0",
 "^/blog/sitemap.xml" => "$0",
 "^/blog/(.+)/?$" => "/blog/index.php/$1"
 )
Drupal

Код: Выделить всё

url.rewrite-final = (
    "^/system/test/(.*)$" => "/index.php?q=system/test/$1",
    "^/([^.?]*)\?(.*)$" => "/index.php?q=$1&$2",
    "^/([^.?]*)$" => "/index.php?q=$1",
    "^/search/node/(.*)$" => "/index.php?q=search/node/$1"
  )
Joomla

Код: Выделить всё

server.error-handler-404  = "/index.php"
url.rewrite-once = (
                "^images*\\.(jpg|jpeg|gif|png)" => "$0",
                "^/administrator.*$" => "$0",
                "^/mambots.*$" => "$0",
                "(/|\\.htm|\\.php|\\.html|/[^.]*)$" => "/index.php"
           )

Заключение

В итоге для моей ситуации был выбран следующий конфиг рерайта нареканий на работу которого пока нет:

Код: Выделить всё

url.rewrite-if-not-file = (
    "^/([^.?]*)\?(.*)$" => "/index.php?q=$1&$2",
    "^/([^.?]*)$" => "/index.php?q=$1"
  )
Надеюсь не зря писал многабукаф и кому-нибудь это все-таки пригодится)))