Добрый день!
Написал вот простенькие правила для модуля 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;
}