Welcome! Log In Create A New Profile

Advanced

Re: Регекс локейшены с русскими именами

Maxim Dounin
July 20, 2011 07:50AM
Hello!

On Wed, Jul 20, 2011 at 06:41:09AM -0400, RedRat wrote:

> Имеется nginx 1.0.4 под которым работает
> DokuWiki с русскими именами страниц.
> Понадобилось все запросы к одному
> диапазону имён редиректить на другой. В
> случае обычного локейшена это делается
> без проблем, всё замечательно работает
> с русскими именами в URI. Проблема
> вылезла, когда я обычный локейшн
> попытался поменять на регексповый
> (чтобы ловить в него запросы без учёта
> регистра) - в него попадают только те
> запросы, русские буквы в которых в
> точности соответствуют содержанию
> регекспа, невзирая на наличие ~*.
>
> Пример:
>
> location ~* ^/старый: {
> rewrite ^(.*):(.*)$ /новый:$2 permanent;
> }
>
> В него попадают запросы, начинающиеся с
> "/старый:", но не попадают запросы,
> начинающиеся со "/Старый:".
>
> ЧЯДНТ?

Для case-insensitive matching'а UTF-8 строк можно сделать так
(если конечно pcre собран с UTF-8 и т.п.):

location ~* (*UTF8)^/старый: {
...
}

Но я *не* рекомендую так делать в общем случае, ибо на запросах с
uri не являющимся валидной utf-8 строкой будет возвращена 500-я
ошибка.

Безопаснее решение - написать несколько статических location'ов
или регулярное выражение с альтернативами, i.e.

location /Старый: { ... }
location /старый: { ... }

location ~ ^/(?:С|с)тарый: { ... }

> P.S. Ещё один вопрос в догонку: в
> документации сказано, что выделения в
> регекс-локейшене можно потом
> использовать в других директивах. Я
> попробовал сделать так:
>
> location ~* ^(/старый:)(.*)$ {
> rewrite ^ /новый:$2 permanent;
> }
>
> Nginx на такой локейшн не ругается - но и
> не работает. Вдумчивое чтение
> документации (два раза) не помогло.
> Подскажите, где я ошибаюсь.

Директива rewrite сама по себе выполняет регулярное выражение,
соответственно $2 будет браться из него (последнего выполненного).
Можно сделать с использованием именованных выделений, так:

location ~ ^/старый:(?<page>.*)$ {
rewrite ^ /новый:$page permanent;
}

Maxim Dounin

_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
http://nginx.org/mailman/listinfo/nginx-ru
Subject Author Posted

Регекс локейшены с русскими именами

RedRat July 20, 2011 06:41AM

Re: Регекс локейшены с русскими именами

Maxim Dounin July 20, 2011 07:50AM

Re: Регекс локейшены с русскими именами

RedRat July 20, 2011 09:48AM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 296
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready