Добро пожаловать на форум, Гость!
Войдите или зарегистрируйтесь!
Имя пользователя:   Пароль:  
Запомнить меня 




Начать новую тему Ответить на тему   [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: mod_rewrite
СообщениеДобавлено: 26 июл 2011, 16:45 
Бородатый сис
Аватар пользователя
Статус: Не в сети

GeoIP: Kyrgyzstan

Сообщений: 2898
Откуда: Из серверной
Зарегистрирован: 03 мар 2010, 15:12
Благодарил (а): 19 раз.
Поблагодарили: 122 раз.
ОС: RHEL 6.7
Наверное самый больной вопрос при использовании 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"
  )


Надеюсь не зря писал многабукаф и кому-нибудь это все-таки пригодится)))


Я не злопамятный, я просто часто ковыряю логи
Изображение


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 
   Похожие темы   Автор   Ответов   Просмотров   Последнее сообщение 
Перенесенная ^_^

в форуме Linux

root

3

38

02 мар 2010, 16:15

Gen1us2k Перейти к последнему сообщению

Перенесенная Документация по Gentoo

в форуме Linux

Gen1us2k

0

4

05 мар 2010, 18:54

Gen1us2k Перейти к последнему сообщению



Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Собрано Raven. Русская поддержка phpBB
phpBB SEO