Перезапись URL
Модуль: 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.
Регулярные выражения
- Шаблоны («подстановочные знаки») сопоставляются со строкой
- Специальные символы (см. [ Http://www.regular-expressions.info/reference.html ]):
- . (точка) - любой символ
- \* (звездочка) - соответствует нулю или более повторений предыдущего символа
- \+(плюс) - соответствует одному или нескольким повторениям предыдущего символа
- ? (вопрос) - соответствует нулю или одному повторению предыдущего символа
- \\?(обратная косая черта-что-то) - соответствует специальным символам
- ^ (курсор) - соответствует началу строки
- $ (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).