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

NGINX: игнорирование определенных параметров URL для целей кеширования

Скажем, мой ключ кеша NGINX выглядит так:

uwsgi_cache_key $scheme$host$request_method$request_uri;

... и это в основном то, что я хочу. Я хочу, чтобы NGINX создавал ключ кеша на основе всего URL-адреса, включая строку запроса. Так что

https://example.com/?a=1&b=1

и

https://example.com/?a=1&b=2

... это отдельные страницы, отдельно кешированные.

Однако говорят, что есть и другие параметры - c и d - что я не хочу влиять на ключ кеша. Другими словами, я хочу


Случай 1

https://example.com/

и

https://example.com/?c=1

и

https://example.com/?c=2

и

https://example.com/?c=1&d=2

... чтобы вернуть ту же страницу из кеша.


Случай 2

И я хочу

https://example.com/?a=1

и

https://example.com/?a=1&d=2

и

https://example.com/?a=1&c=1&d=3

... чтобы вернуть ту же страницу из кеша, которая отличается от страницы в случае 1.


Я ищу способ построить uwsgi_cache_key так что он может объяснить эти случаи. Я не хочу делать это через перенаправления.

Количество параметров, которые я хочу игнорировать при построении ключа - c и d, в данном примере - ограничено; количество чисел или параметров, которые я не хочу игнорировать, - нет.

Как бы вы это сделали? (Да, это в основном о fbclid и utm_* и их кузены.)


ОБНОВИТЬ:

Вот переписанное решение @tero-kilkanen с map, в случаях, когда fbclid и launcher являются нежелательными параметрами. Не знаю, насколько это замедляет ответы.

    map $args $cachestep1 {
        default $args;
        ~^(fbclid=[^&]*&?)(.*)$             $2;
        ~^([^&]*)(&fbclid=[^&]*)(&?.*)$     $1$3;
    }

    map $cachestep1 $cacheargs {
        default $cachestep1;
        ~^(launcher=[^&]*&?)(.*)$             $2;
        ~^([^&]*)(&launcher=[^&]*)(&?.*)$     $1$3;
    }

Я не тестировал такой подход, но думаю, что он может сработать:

map $args $cacheargs {
    ~^(.*)a=.+&(.*)$ $1$2;
}

map $cacheargs $cacheargs1 {
    ~^(.*)b=.+&(.*)$ $1$2;
}

uwsgi_cache_key $scheme$host$request_method$uri$cacheargs1;

Первая карта удаляется a=.+ из $args и записывает это в $cacheargs.

Вторая карта удаляет b=.+ из $ cacheargsand records it to$ cacheargs1`.

затем $cacheargs1 используется как часть ключа кеша.

Оригинальный ответ ниже.


Ты можешь использовать:

uwsgi_cache_key $scheme$host$request_method$uri$arg_a$arg_b;

Это означает, что ключ кеша создается с использованием нормализованного URI (без аргументов запроса) и аргументов запроса. a и b.