Модуль: mod_rewrite

Описание

внутренние редиректы, ЧПУ

Результат переписанного url-пути должен начинаться с ' / ' (применяется с 1.4.50)

Параметры

url.rewrite-once

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

например

url.rewrite-once = ( "<regex>" => "<relative-uri>" )

или по нескольким правилам ..

url.rewrite-once = ( 
  "<regex1>" => "<relative-uri1>",
  "<regex2>" => "<relative-uri2>" 
)

url.rewrite-repeat

Переписывает набор URL-адресов внутри веб-сервера перед их обработкой

e.g.

url.rewrite-repeat = ( "<regex>" => "<relative-uri>" )

Разница между этими опциями заключается в том, что, хотя url.rewrite-repeat позволяет применять несколько (отдельно определенных) правил перезаписи в строке, url.rewrite-once приведет к пропуску дальнейших правил перезаписи, если выражение соответствует. Таким образом, url.rewrite-once ведет себя как Apache 'RewriteRule ... [L]: http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriterule

Параметры url.rewrite и url.rewrite-final были сопоставлены с url.rewrite-once в 1.3.16.

url.rewrite-[repeat-]if-not-file

Новое: для ветки 1.4.x от 1.4.24 или r2647 от svn:

Перезаписывает набор URL-адресов внутри веб-сервера ДО того, как они будут обработаны, и проверяет, что файлы не существуют.

Возьмите примеры сверху, это имитирует Apache "! -F" RewriteRule. Обратите внимание, что это не работает для каталогов, каналов, сокетов и т.п.

Где я хочу это использовать? Может быть, например, с серверной частью Drupal, где mod_magnet (имеет решение Apaches-f и-d) может быть не очень удобным или просто "слишком много" для такого рода перезаписей. Это закрывает запрос #985.

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

  • . (точка) - любой символ
  • \* (звездочка) - соответствует нулю или более повторений предыдущего символа
  • \+(плюс) - соответствует одному или нескольким повторениям предыдущего символа
  • ? (вопрос) - соответствует нулю или одному повторению предыдущего символа
  • \\?(обратная косая черта-что-то) - соответствует специальным символам
  • ^ (курсор) - соответствует началу строки
  • $ (dollar) - соответствует концу строки
  • [набор] - соответствует любому из символов внутри квадратных скобок.
  • [^набор] - соответствует любому символу, который не находится внутри квадратных скобок.
  • (шаблон) - группировка, запоминает, что шаблон соответствует специальной переменной
  • {n,m} - от n до m раз, соответствующих предыдущему символу (можно опустить m, чтобы обозначить> = n раз)
  • (?!выражение) - сопоставить что угодно, но выражение в текущей позиции. Пример: "^(/(?!(favicon.ico$|js/|images/)).*)" => "/fgci/$1"
  • Обычные буквенно-цифровые символы рассматриваются как нормальные

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

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

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

Расширенные шаблоны замены

lighttpd предоставляет способы кодирования переадресации и перезаписи обратных ссылок (начиная с 1.4.50) в фигурных скобках %{...} или ${...}

Сохраняется до девяти (9) совпадений для %{1} - %{9}. До девятнадцати (19) совпадений сохраняются для ${1} - ${19}.

В дополнение к %1 и $1 теперь поддерживаются следующие модификаторы, за которыми следует номер для обратной ссылки, например, ${esc:1}.

  • ${noesc:...} не экранированые
  • ${esc:...} экранирование всех не буквенно-цифровых - . _ ~ включая двойное  экранирование  %
  • ${escape:...} экранировать все не алфавитно-цифровые - . _ ~ включая двойное  экранирование  %
  • ${escnde:...} экранировать все не алфавитно-цифровые - . _ ~ но нет двойного экранирования %
  • ${escpsnde:...} экранировать все не алфавитно-цифровые - . _ ~ / но без двойного экранирования  % (сохраняет литерал /)
  • ${tolower:...}
  • ${toupper:...}
  • ${encb64u:...} кодировать в символы base64url (без заполнения)
  • ${decb64u:...} декодировать из символов base64url
  • %{noesc:...}
  • %{esc:...}
  • %{escape:...}
  • %{escnde:...}
  • %{escpsnde:...}
  • %{tolower:...}
  • %{toupper:...}
  • %{encb64u:...}
  • %{decb64u:...}

lighttpd предоставляет способы замены частей URI без необходимости совпадения с регулярным выражением (начиная с 1.4.50) (и ему может предшествовать модификатор кодирования, например, ${tolower:url.authority})

  • ${url.scheme}
  • ${url.authority}
  • ${url.port}
  • ${url.path}
  • ${url.query}
  • ${qsa} добавляет строку запроса, если она не пуста

Примеры

Регулярное выражение соответствует полному REQUEST_URI, предоставленному пользователем, включая строку запроса.

# следующий пример, однако, просто имитирует vhost путем перезаписи
# * вы никогда не сможете изменить document-root с помощью mod_rewrite
# используйте mod_ * host вместо того, чтобы сделать реальный mass-vhost

server.document-root = "/www/htdocs/" 
$HTTP["host"] =~ "^.*\.([^.]+\.com)$" {
  url.rewrite-once = ( "^/(.*)" => "/%0/$1" )
}

# запрос:        http://any.domain.com/url/ 
# прежде чем переписывать: REQUEST_URI="/www/htdocs/url/" 
# и DOCUMENT_ROOT="/www/htdocs/" %0="any.domain.com" $1="url/" 
# после перезаписи:  REQUEST_URI="/www/htdocs/any.domain.com/url/" 
# тем не менее, у вас есть DOCUMENT_ROOT=/www/htdocs/

# обратите внимание, что у нас есть два регулярных выражения: то, с которым сравнивается 
# $HTTP["host"], и одно из правил перезаписи. нумерованные подвыражения,
# доступные для построения относительного uri, имеют префикс " % "для подвыражений
# первого совпадения регулярного выражения и" $ " для подвыражений второго.
# подвыражение 0 интерполирует всю строку соответствия: %0 для всей строки,
# соответствующей условию, и $0 для всей строки, соответствующей правилу перезаписи.

# если правило перезаписи не включено в условный блок, 
# доступны только переменные с префиксом'$'.

url.rewrite-once = ( "^/id/([0-9]+)$" => "/index.php?id=$1",
                     "^/link/([a-zA-Z]+)" => "/index.php?link=$1" )

С mod_redirect

Правила перезаписи всегда выполняются перед правилами перенаправления. Это верно независимо от порядка загрузки модуля или порядка правил в конфигурации (lighttpd v1.4.13). Тем не менее, mod_rewrite предоставляет механизм для передачи URL-адресов через unmangled: укажите "$0" в качестве целевого правила, но убедитесь, что правило соответствует всей строке, так как $0 является всей соответствующей строкой.

например

url.rewrite-once = (
    "^/foo"  => "$0",
    "^/(.*)" => "/handler/$1" 
)

url.redirect = (
    "^/foo"  => "http://foo.bar/" 
)

Начиная с версии 1.4.40, альтернативой является указание пустого целевого объекта для Правила перезаписи. Это приведет к тому, что сопоставленное правило не изменит url-адрес и пропустит дальнейшие правила перезаписи.

url.rewrite-once = (
    "^/foo"  => "",   # вместо (бессмысленного) пустого url-адреса url-адрес не будет изменен
    "^/(.*)" => "/handler/$1" 
)

Обходной путь для "Слишком длинное имя файла" в Windows

Во время работы Lighttpd на Windows, вы можете получить 500 Внутренняя ошибка сервера, если вычисляемое имя файла больше, чем 255 символов.
В журнале ошибок это будет (ответ.С. 537) файл не найден ... или так: Слишком длинное имя файла / very_looooong_path ->.
Как обходной путь можно использовать mod_rewrite, чтобы избежать этой ошибки.

server.modules += ("mod_rewrite")
url.rewrite-once = ( ".{250,}" => "/toolong.php" )

Если обработчик ошибок PHP, то $_SERVER ['REQUEST_URI'] будет содержать полный URI.

Передача / сопоставление строки запроса (GET variables)

Если вы хотите передать строку запроса (?foo=bar) к месту назначения перезаписи вы должны явно соответствовать ему:

url.rewrite-once = (
    "^/news/([^\?]+)(\?(.*))?" => "/news.php?title=$1&$3" 
)

Примечания Разное

Примечание: перезапись url-адреса не работает в условном $HTTP["url"], но исправлена в v1.4.34 (см. #2526).