#regex #pcre #varnish
#регулярное выражение #pcre #varnish
Вопрос:
У меня возникла проблема с запретом URL внутри Varnish (версия 6.0.2).
Я пытаюсь запретить URL, подобный этому
/api/v2/product?param1=value1amp;param2=value2param3=value3
Если я дам эту команду:
varnishadm ban req.url '~' '^/api/v2/product'
Это работает правильно, но оно запрещает все URL, начинающиеся с /api/v2/product
, и мне нужно запретить только этот конкретный URL.
Это попытки, которые я сделал:
varnishadm ban req.url '~' '^/api/v2/product?param1=value1amp;param2=value2param3=value3'
Оно не возвращает никакой ошибки, но и не запрещает URL
varnishadm ban req.url '~' '^/api/v2/product?param1=value1'
и я получаю эту ошибку:
Unknown request.
Type 'help' for more info.
Syntax Error: Invalid backslash sequence
Command failed with error code 100
varnishadm ban req.url '~' '^/api/v2/product[?]param1=value1'
или
varnishadm ban req.url '~' '^/api/v2/product\?param1=value1'
Оно не возвращает никакой ошибки, но и не запрещает URL
Я пробовал также без регулярных выражений, используя ==
varnishadm ban req.url '==' '/api/v2/product?param1=value1amp;param2=value2param3=value3'
Оно не возвращает никакой ошибки, но и не запрещает URL
Я думал, что проблема в ?
поэтому я попытался использовать .*
вместо ?
Я пытался:
varnishadm ban req.url '~' '^/api/v2/product.*param1=value1'
И это работает, оно запрещает все URL, начинающиеся с: ^/api/v2/productamp;param1=value1
итак, я попробовал
varnishadm ban req.url '~' '^/api/v2/product.*param1=value1amp;param2=value2'
Оно не возвращает никакой ошибки, но и не запрещает URL, поэтому я предположил, что проблема может быть в amp;
этом разе, поэтому я попытался:
varnishadm ban req.url '~' '^/api/v2/product.*param1=value1.*param2=value2'
Но ничего, это не возвращает ошибок, но и не запрещает этот URL.
Любая попытка экранировать специальный символ с помощью возвращает сообщение об ошибке:
Unknown request.
Type 'help' for more info.
Syntax Error: Invalid backslash sequence
Command failed with error code 100
В руководстве Varnish говорится, что программное обеспечение использует стандарты PCRE, но я не могу найти способ написать для него регулярное выражение.
Любая помощь или предложения будут действительно оценены.
Спасибо H2K
Ответ №1:
Я нашел проблему, там был
set req.url = std.querysort(req.url);
внутри кода, который изменял порядок моих параметров get, делая регулярное выражение недействительным.