LINUX.ORG.RU

Аналог RewriteBase в nginx

 ,


0

1

Добрый день!

Написал вот простенькие правила для модуля http_rewrite Nginx. Получилось так, что в 20 строчках название локейшена встречается 15 раз. Это не очент хорошо, так как если я захочу перенести всё в другую директорию, то придётся делать 15 правок.

location /phototest/ {
        if (-d $request_filename) {
                rewrite ^/phototest/(.*[^/])$ /phototest/$1/ permanent;
                rewrite ^/phototest/photos/(.*)$ /phototest/?rewrite=1&dir=$1 last;
        }
        rewrite ^/phototest/small/(.*)$ /phototest/getimage.php?mode=small&filename=photos/$1 last;
        rewrite ^/phototest/thumb/(.*)$ /phototest/getimage.php?mode=thumb&filename=photos/$1 last;
        if ($args ~ "^dir=([^&]*)$") {
                set $dir $1;
                rewrite ^/phototest/$ /phototest/photos/$dir? permanent;
        }
        if ($args ~ "^dir=([^&]*)&(.*)$") {
                set $dir $1;
                set $extraargs $2;
                rewrite ^/phototest/$ /phototest/photos/$dir?$extraargs? permanent;
        }
        if ($args !~ "^rewrite=1") {
                rewrite ^/phototest/$ /phototest/photos/ permanent;
        }
}

Ввёл переменную. С её помощью удалось сократить до 9, но всё равно это много. Насколько я понял, переменную нельзя использовать в регэкспах. Так ли это?

location /phototest/ {
        set $rewritebase /phototest;
        if (-d $request_filename) {
                rewrite ^/phototest/(.*[^/])$ $rewritebase/$1/ permanent;
                rewrite ^/phototest/photos/(.*)$ $rewritebase/?rewrite=1&dir=$1 last;
        }
        rewrite ^/phototest/small/(.*)$ $rewritebase/getimage.php?mode=small&filename=photos/$1 last;
        rewrite ^/phototest/thumb/(.*)$ $rewritebase/getimage.php?mode=thumb&filename=photos/$1 last;
        if ($args ~ "^dir=([^&]*)$") {
                set $dir $1;
                rewrite ^/phototest/$ $rewritebase/photos/$dir? permanent;
        }
        if ($args ~ "^dir=([^&]*)&(.*)$") {
                set $dir $1;
                set $extraargs $2;
                rewrite ^/phototest/$ $rewritebase/photos/$dir?$extraargs? permanent;
        }
        if ($args !~ "^rewrite=1") {
                rewrite ^/phototest/$ $rewritebase/photos/ permanent;
        }
}

Возможно ли как-нибудь ещё сократить количество упоминаний? ([^/]*) не предлагать, так как заранее неизвестно, какой уровень вложенности будет.

Чтобы убрать лишние детали, то вопрос такой: можно ли уменьшить количество упоминаний в этом фрагменте, при том, что уровень вложенности локейшена заранее неизвестен, а вариант запроса /phototest/small/phototest/small/phototest/small теоретически возможен?

location /phototest/ {
        set $rewritebase /phototest;
        rewrite ^/phototest/small/(.*)$ $rewritebase/getimage.php?mode=small&filename=photos/$1 last;
        rewrite ^/phototest/thumb/(.*)$ $rewritebase/getimage.php?mode=thumb&filename=photos/$1 last;
}

([^/]*) не предлагать, так как заранее неизвестно, какой уровень вложенности будет.

Кстати, как только написал, понял, в чём дело. Надо было просто умерить аппетиты знаком вопроса.

(.*?) сработало:

location /phototest/ {
        rewrite ^/(.*?)/small/(.*)$ $1/getimage.php?mode=small&filename=photos/$2 last;
        rewrite ^/(.*?)/thumb/(.*)$ $1/getimage.php?mode=thumb&filename=photos/$2 last;
}

Спасибо Лору за возможность высказаться и самому найти решение.

Теперь тут нужен тег [жж].

Pythagoras ★★ ()
Последнее исправление: Pythagoras (всего исправлений: 2)
Ответ на: комментарий от Pythagoras

А, нет, это не сработает, если локейшн содержит «/small/» в своём пути. Как быть тогда?

Pythagoras ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.