Предыстория:
Понадобилось мне как-то одна злющая CMS (злющая не в плане продвинутости а в плане капризности). Там она работала раньше стоял nginx и правила рерайта были следующими
Код: Выделить всё
try_files $uri $uri/ /index.php?q=$uri&$args;
Код: Выделить всё
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.rewrite-repeat
По сути то же что и предыдущая опция, но url.rewrite-once остановит дальнейшую перезапись URL, если выражение совпало, а с помощью url.rewrite-once можно использовать несколько вариантов перезаписи адресов.
Код: Выделить всё
url.rewrite-repeat = ( "<выражение>" => "<относительный_путь>" )
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"
)
Код: Выделить всё
url.rewrite = (
"^/(wp-.+).*/?" => "$0",
"^/(sitemap.xml)" => "$0",
"^/(xmlrpc.php)" => "$0",
"^/(.+)/?$" => "/index.php/$1"
)
Код: Выделить всё
url.rewrite = (
"^/?$" => "/blog/index.php",
"^/blog/(wp-.+)$" => "$0",
"^/blog/xmlrpc.php" => "$0",
"^/blog/sitemap.xml" => "$0",
"^/blog/(.+)/?$" => "/blog/index.php/$1"
)
Код: Выделить всё
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"
)
Код: Выделить всё
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"
)