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

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

URL-адрес: /продукт/123/цена/в наличии.

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

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

/продукты?id=123&sort=цена

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

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

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


person davewilliamson    schedule 02.03.2013    source источник
comment
Прежде чем опубликовать ответ, правильно ли я думаю, что я перехожу от одного приложения (со старой схемой URL-адресов) к новому (с новой схемой), и что оба они будут работать бок о бок какое-то время? Вы хотите сгенерировать новую схему URL-адресов в обоих приложениях, но переписать запросы к URL-адресам, которые идут в старое приложение, обратно в старый формат?   -  person Richard Hulse    schedule 03.03.2013
comment
Да, это почти в точку! Мы сразу же добавим некоторые новые функции, а затем перенесем части приложения по мере того, как новые функции станут доступными.   -  person davewilliamson    schedule 03.03.2013
comment
Поэтому - stage1, как старые, так и новые URL-адреса, переходят к старым и новым приложениям. Этап 2. Как только все ссылки на старые URL-адреса будут удалены из приложений, мы реализуем перенаправления для старых URL-адресов (для закладок, ссылок и т. д.). Этап 3: после полного перехода на новое приложение и прекращения использования старой схемы URL-адресов мы удалим все правила перезаписи. Я надеюсь, что это делает его более ясным. Спасибо   -  person davewilliamson    schedule 03.03.2013


Ответы (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";
}

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

Удачи!

person Richard Hulse    schedule 03.03.2013
comment
Спасибо, это действительно полезно :) - person davewilliamson; 06.03.2013
comment
Если ответ правильный, можете ли вы отметить его как таковой? Спасибо! :-) - person Richard Hulse; 11.03.2013