nginx регулярное выражение

SN
На сайте с 04.07.2013
Offline
84
2721

Подскажите, как можно упростить запись nginx. У меня сейчас так:

rewrite ^/(.*)/$ /script.php?value1=$1;

rewrite ^/(.*)/(.*)/$ /script.php?value1=$1&value2=$2;

rewrite ^/(.*)/(.*)/(.*)/$ /script.php?value1=$1&value2=$2value3=$3;

rewrite ^/(.*)/(.*)/(.*)/(.*)/$ /script.php?value1=$1&value2=$2value3=$3&value4=$4;

rewrite ^/(.*)/(.*)/(.*)/(.*)/(.*)/$ /script.php?value1=$1&value2=$2value3=$3&value4=$4&value5=$5;

и т.д.

В этих записях есть определенная закономерность. Возможно ли записать это одним выражением?

[umka]
На сайте с 25.05.2008
Offline
456
#1

rewrite ^/(.*)/(?:(.*)/)(?:(.*)/)(?:(.*)/)(?:(.*)/)$ /script.php?value1=$1&value2=$2value3=$3&value4=$4&value5=$5;

Лог в помощь!
A
На сайте с 19.07.2010
Offline
130
#2
SeoNk:
Возможно ли записать это одним выражением?

Как по мне, то проще и логичнее передать все без изменений в /script.php

И уже внутри скрипта проверять/фильтровать/присваивать входные значения нужным переменным.

При не внимательном миксе ЧПУ и /script.php?value1=...&value2=...&value3=...&value4=... можно наплодить дупов страниц или любой желающий может сделать это за вас.

.............
SN
На сайте с 04.07.2013
Offline
84
#3
'[umka:
;14214935']rewrite ^/(.*)/(?:(.*)/)(?:(.*)/)(?:(.*)/)(?:(.*)/)$ /script.php?value1=$1&value2=$2&value3=$3&value4=$4&value5=$5;

К сожалению не сработало.. Очень хотелось бы доработать эту регулярку но не знаю что в ней править. Подскажите что значит ?:

J
На сайте с 20.02.2014
Offline
120
jkm
#4

(?: ) позволяет группировать также как и обычные скобки, но без сохранения результата в переменные $1..$9

Я так понимаю, что там нужно одним выражением обрабатывать переменное количество элементов. Тогда последние 4 части должны быть необязательными

(?:(.*)/)?

Метасимвол точка совпадает также и со слешем, поэтому предлагаю вместо точки [^/].

(?:([^/]*)/)?

Наверно и квантификатор * стоит заменить на +, иначе будет совпадать с адресами вида ////.

Вот еще вариант


rewrite ^/([^/]+)/(?:([^/]+)/)?(?:([^/]+)/)?(?:([^/]+)/)?(?:([^/]+)/)?$ /index.php?value1=$1&value2=$2&value3=$3&value4=$4&value5=$5;

Когда в урл менее 5 частей, то последние переменные будут объявлены пустыми

/lol/ => /index.php?value1=lol&value2=&value3=&value4=&value5=

Удалить пустые get параметры можно так


if ($args ~ ^(.*?)(?:[^&=]+=(?:&|$))+(.*) ) {
set $args $1$2;
}
J
На сайте с 20.02.2014
Offline
120
jkm
#5

Или обрезать пустые переменные с помощью map.


map "value1=$1&value2=$2&value3=$3&value4=$4&value5=$5" $tmp {
~^(?<1>(?:&?[^&=]+=[^&]+)+) $1;
}

А в rewrite тогда использовать /index.php?$tmp;

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий