[sisyphus] replace regexp в nginx rewrite правиле

Sergey Vlasov vsu на altlinux.ru
Сб Ноя 26 17:17:33 MSK 2011


On Sat, Nov 26, 2011 at 02:14:01PM +0300, Michael Bykov wrote:
> господа, помогите, пожалуйста, кто чем может, сами мы не местные...
> 
> мне нужно в правиле nginx заменить путь с /a/b/c/d... etc на /a_b_c_d... etc
> 
> поиск в гугле не дал результатов ввиду идиотизма проблемы. Но в данном
> случае очень нужно.
> 
> В сизифовском nginx нет perl'а, на перле было бы проще
> 
> Вот это неправильно:
> 
> rewrite / _ permanent;

Действительно, это работать не будет, поскольку rewrite в nginx всегда
заменяет весь URI, а не меняет в существующем только подстроку,
соответствующую регулярному выражению.

> rewrite ^(([^/]*)/) $2/ permanent;
> 
> а как правильно?

Можно попробовать сгородить что-то такое:

    location ~ "^/([^/]*/){11}" {
        return 404;
    }

    location ~ ^/[^/]*/ {
        rewrite ^(/[^/]*)/([^/]*)$ $1_$2 permanent;
        rewrite ^(/[^/]*)/(.*)$ $1_$2 last;
    }

    location / {
        # тут обрабатываем запрос, в котором не было "/"
    }

Первый location более красиво обрабатывает запросы, которые содержат
более 10 лишних "/" (чтобы на них не выдавалась ошибка 500).

Второй location обрабатывает "нормальные" запросы с лишними "/".
Первый rewrite срабатывает, когда в запросе остался последний лишний
"/" - в этом случае нужно отдать redirect.  Второй rewrite
обрабатывает случаи, когда "/" несколько - в этом случае заменяется
первое вхождение, после чего обработка URI начинается заново
(допускается до 10 таких циклов; если этого мало, можно добавить перед
ним ещё rewrite, заменяющий сразу несколько вхождений, и
соответствующим образом изменить ограничение в первом location).

Если количество "/" жёстко ограничено, можно просто прописать правила
для всех нужных вариантов, чтобы не возиться с рекурсией через last.
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 198 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/sisyphus/attachments/20111126/2cc8fc63/attachment.bin>


Подробная информация о списке рассылки Sisyphus