Filter query string for Redis-Nginx cache

In EasyEngine the page cache is being stored and retrieved by Nginx from Redis. It first creates a cache key and stores the HTML content as value.

By default in EasyEngine, if the request comes with query parameter(s) then Nginx skips caching and sends the request directly to PHP. This mechanism works fine for the smaller sites but in the case of sites with high traffic, this creates performance issues.

While analyzing logs for the same, I found that number of requests is hitting the home page with utm_* queries with different values most of the time. We also wanted a mechanism where we can cache search pages, product-related pages, etc.

Writing if conditions won’t work as we also wanted to cache with multiple query parameters.

⚠️ This method is experimental.


Allowed Parameters: “q”, “s”



As you can see above the cache key generated with only q and s parameters ignoring utm_source.

Nginx Configuration

0. Take backup of your current Nginx configurations.

1. Comment out following block in Nginx configuration file

if ($query_string != "") {
set $skip 1;

Path of the Nginx configuration file in EasyEngine is: /opt/easyengine/sites/

2. Add following Lua script in top of the PHP location block location ~ .php$

set $has_args '';

set_by_lua $request_uri_without_args 'return string.gsub(ngx.var.request_uri, "?.*", "")';

set_by_lua $cleaned_args '
local allow = { "p", "q", "s" }
local args, err = ngx.req.get_uri_args()
local c_args = {}

for arg, arg_value in pairs(args) do
for _, allowed_arg in ipairs(allow) do
if arg == allowed_arg then
if type(args[allowed_arg]) ~= "boolean" then
table.insert(c_args, arg .. "=" .. string.gsub(args[allowed_arg], "%s+", ""))
ngx.var.has_args = "?"
table.insert(c_args, arg)
ngx.var.has_args = "?"

return table.concat(c_args, "&")

Update allow { "p", "q", "s" } as per your needs. Be sure that not mentioning the required parameters here may break the site functionality.

3. Update the cache key as in the following code:

set $key "example.com_page:http$request_method$host$request_uri_without_args$has_args$cleaned_args";
if ($HTTP_X_FORWARDED_PROTO = "https") {
set $key "example.com_page:https$request_method$host$request_uri_without_args$has_args$cleaned_args";

4. Restart Nginx


Get Cache-key in the response header

Add following in the PHP location block.

more_set_headers 'X-CACHE-KEY $key';


To view the keys stored in the Redis for page cache you can use

redis-cli keys "*_page*"

Lua code

Compile Nginx image with debug flag. Here‘s the documentation.

Leave a Reply

Your email address will not be published. Required fields are marked *