NGINX:为了缓存目的而忽略某些 URL 参数

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以便能够解决这些情况。我不想通过重定向来实现。

在构造键时我想要忽略的参数数量(在此示例中为cd)是有限的;而我不想忽略的参数数量则没有限制。

您将如何着手做这件事?(是的,这主要fbclidutm_*和他们的表兄弟有关。)


更新:

以下是@tero-kilkanen 解决方案的重写map,其中fbclidlauncher是不需要的参数。我不知道这会减慢响应速度多少。

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

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

答案1

我还没有测试过这样的方法,但我认为它可以起作用:

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=.+从 $cacheargs and records it to$cacheargs1` 中删除。

然后$cacheargs1被用作缓存键的一部分。

以下是原始答案。


您可以使用:

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

这意味着缓存键是使用规范化的 URI(没有查询参数)以及查询参数a和构建的b

相关内容