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.