[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