Nginxcaching与variables参数顺序

我使用基于请求URI的nginx生成caching键,并直接检查memcache,然后在未findcaching键的情况下从PHP-FPM提供页面。 我的问题是,许多url有不同的查询string选项,因此每个响应生成两个或多个单独的caching键。

我的caching设置是这样的:

set $cache_key "$uri?$args"; 

因此,像这样以不同顺序的查询string参数进入的URL最终会为相同types生成多个可能的caching键:

 http://example.com/api/2.2/events.json?id=53&type=wedding&sort=title&limit=10 http://example.com/api/2.2/events.json?id=53&limit=10&type=wedding&sort=title http://example.com/api/2.2/events.json?id=53&limit=10&sort=title&type=wedding 

广告n为n! 可能性…

最终的结果是memcache往往比它应该填充得快得多,因为我有一个潜在的caching内容的副本,因为查询string参数的顺序不同。 有没有一种方法可以在设置caching键之前按字母顺序排列它们以避免这种情况? 有没有其他的方法来优雅地解决这个问题?

如果您知道哪些参数对生成缓存键很重要,那么您可以手动指定它们。 根据你的例子,我写了下一个例子:

 set $cache_key "$uri?id=$arg_id&type=$arg_type&sort=$arg_sort&limit=$arg_limit"; 

或者你可以使用嵌入式的Perl,并编写自己的函数,将生成缓存键,请看这里的例子http://wiki.nginx.org/Configuration#Embedded_Perl_examples

假设你自己生成链接,而不是试图在nginx中重新排序它们,你可以使用输出重写器来确保它们在页面生成中一致的顺序吗?