Получить значение URL из лака

Я хочу вычеркнуть значения из URL-адреса в лаке, чтобы я мог выполнять различные действия в зависимости от URL-адреса, например:

URL: / product / 123 / price / available.

Я хочу преобразовать это в /products? Id=123&sort=price&available=true

Я также хотел бы иметь возможность (если это возможно) устанавливать значения в заголовке запроса, поэтому вместо передачи всех параметров в URL я мог бы сделать следующее:

/ Продукты? ID = 123 & рода = цена

  • с заголовком: x-show-available-only: true

Я ценю, что второй пример выглядит немного странно, но таким образом мы могли бы передавать новые параметры обратно в наше устаревшее приложение и гарантировать, что ни один из новых параметров не будет мешать текущим параметрам - мы будем просто читать новые параметры через заголовок, пока мы не перенесем все наша функциональность для нашей новой платформы.

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

1 ответ

Это НЕ проверено, но должно быть достаточно близко, чтобы вы могли настроить его правильно.

На основании вашего URL:

/product/123/price/available

Вам нужно будет указать два бэкэнда (смените IP-адреса на свои):

backend old_app {
    .host = "127.0.0.1";
    .port = "80";
}

backend new_app {
    .host = "127.0.0.2";
    .port = "80";
}

И код в вашем vcl_recv:

if (req.url ~ "^/product/") {
    set req.url = regsub(req.url, "/product/([0-9]/)/([a-zA-Z])", "/products?id=\1&sort=\2");
    set req.backend = old_app;
} else {
    set req.backend = new_app.
}

if (req.url ~ "/available") {
    set req.http.x-show-available-only = "true";
}

Вы можете добавить больше правил регулярных выражений, как если бы /else блоков.

Удачи!

Другие вопросы по тегам