Nginx 映射指令

Nginx map directive

我试图从 nginx 日志中排除对 *.ong 的请求。以下地图有效:

map_hash_bucket_size 128;
map $request $loggable {
    "GET /heizungskeller/graphs/ips_var_48757-day.png HTTP/1.1" 0;
    default 1;
    }

但是通配符没有:

map_hash_bucket_size 128;
map $request $loggable {
    "*.png HTTP/1.1" 0;
    default 1;
    }

这是为什么?

通配符 * 可以更轻松地匹配主机名的前缀或后缀值。仅当关键字 "hostnames" 出现在地图块的顶部时才有效。

由于您尝试匹配请求行而不是主机名,因此您需要使用正则表达式而不是通配符:

map $request_uri $loggable {
    default 1;
    ~*(.*?)\.png$ 0;
}

此外,使用 map 指令并不是控制访问日志中哪些内容进入访问日志的最佳方式。通常,更可取的做法是引入一个与您的模式匹配的新位置并在那里禁用日志记录。例如:

location ~* ^.+\.(jpg|gif|png)$ {
    access_log off;
}