假设我的 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;
}
答案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
。