Назад | Перейти на главную страницу

Regex для определения параметра URL-адреса, не зная, какой это будет параметр

Итак, я работал над созданием кластера haproxy (1.5.x) и натолкнулся на загвоздку, когда для конкретного веб-приложения я хочу передать API GET в кластер приложений только для чтения, а PUT в гораздо меньший кластер записи. .

Я пробовал использовать path_reg, который, похоже, не хочет совпадать ни с чем, кроме имени файла. Кажется, мне следует использовать производные urlp, но их правильное использование ускользнуло от меня. Один сложный нюанс с параметрами URL, которые я пытаюсь уловить и различить, все начинается с «получить» или «установить» что-то ... но параметры не имеют значений. Из того, что я понял или попытался сделать, производные urlp обычно ожидают, что с параметром будет связано значение, поэтому мне кажется, что я не могу просто использовать что-то вроде:

acl api_gets urlp_reg(get) (get?){1}

из URL-адреса с такими параметрами, как:

/api.foo?apikey=stuff&param1=foo&getsomething&param2=bar

Так же, path_reg похоже, не обнаруживает ничего, кроме имени файла, поэтому рудиментарное тестирование попыток сопоставить следующее в качестве доказательства концепции также было бесплодным:

acl path_sanity_check path_reg ^\/api\.foo\?apikey.*

В то время как просто создание шаблона регулярного выражения ^ / api.foo подберет, куда отправляются запросы.

Должен Я использую для этого urlp_reg, даже если параметры не имеют значений? Какие есть альтернативы, если не использовать производную urlp?

Путь извлекает дорожка. Запрос не является частью пути. capture.req.uri получает полный URI.

Хотя это небрежно, вы можете сопоставить это примерно с этим:

acl foo capture.req.uri -m reg [&\?]get

Экранирование класса символов может потребовать корректировки, но идея состоит в том, чтобы найти либо ?get или &get в URI запроса.

Если вы создаете новый кластер, используйте HAProxy 1.6, в котором есть ряд новых полезных извлечений и конвертеров, а также дополнительная интеграция с Lua для более сложной логики.

urlp_reg это неправильное решение, потому что совпадение регулярного выражения предназначено для стоимость параметра, а не его имени ... и у вас нет значений.