Добрый день.
Использую nginx в качестве прокси для JSON провайдера данных. Как заменить значение http-параметра limit, если он не удовлетворяет regexp ^\d{1,2}$? Для случая, когда параметр отсутсвует решение уже нашел.
Сейчас конфигурация location внутри server выглядит так:
location / {
if ( $arg_limit !~ "^\d{1,2}$" ) {
rewrite ^(.*)$ $1?limit=10 break;
}
proxy_pass http://data_provider;
}
Это работает для случая, когда параметр отсутствует в исходном запросе, но когда параметр в запросе уже есть, но не удовлетворяет regexp'у, то в запросе к backend'у приходит два параметра, что понятно, так как исходный параметр limit никуда не делся. при замене важно сохранить остальные параметры, кроме заменяемого, так что добавить ? в конец rewrite правила не подойдет в качестве решения.
Требуемое поведение:
# нет параметра limit в запросе, значит добавляем его со значением по-умолчанию
/path?key=1 → /path?limit=10&key=1
# параметр есть и удовлетворяет regexp, ничего не делаем
/path?key=1&limit=50 → /path?key=1&limit=50
# параметр есть, но не удовлетворяет regexp — заменяем значение параметра на значение по-умолчанию
/path?key=1&limit=5000 → /path?limit=10&key=1
nginx:
nginx: nginx version: nginx/1.0.10
nginx: built by gcc 4.4.5 (Debian 4.4.5-8)
nginx: TLS SNI support enabled
nginx: configure arguments: --with-ipv6 --with-pcre --with-http_ssl_module --with-http_addition_module --with-http_xslt_module --with-http_geoip_module --with-http_gzip_static_module --with-http_secure_link_module