在nginx conf中禁用特定用户代理的日志记录

时间:2018-11-08 19:11:56

标签: nginx

我想禁用特定用户代理的日志记录。这是我当前的conf文件的一部分。

if ($http_user_agent ~ (bingbot|AhrefsBot|DotBot|Exabot|Baiduspider|SemrushBot) ) { return 403; }

我尝试添加access_log off;,但出现以下错误:

  

nginx:[emerg]此处不允许使用“ access_log”指令

我假设这是因为我只有一个服务器块。我也需要定位块。我尝试了以下代码:

location / { if ($http_user_agent ~ (bingbot|AhrefsBot|DotBot|Exabot|Baiduspider|SemrushBot) ) { return 403; } }

但是出现以下错误:

  

重复的位置“ /”

在我的配置文件中,我已经有了以下代码:

location / { try_files $uri $uri/ =404; }

我可以将两个位置摘要合并为一个吗?或者我该如何进行?

2 个答案:

答案 0 :(得分:1)

正如您的问题所指出的,除非在access_log内包含if指令,否则不能在location块内使用。但是,access_log指令确实包含一个if=condition,它可以由map控制。手册this section的末尾有一个示例。

例如:

map $http_user_agent $goodagent {
    default                                                    1;
    ~(bingbot|AhrefsBot|DotBot|Exabot|Baiduspider|SemrushBot)  0;
}    

server {
    access_log ... if=$goodagent;

    if ($goodagent = 0) { return 403; }

    ...
}

map伪指令必须放在server块之外。可以将access_log语句放在server块的内部还是外部,这取决于它是应用于所有server块还是仅应用于一个。

答案 1 :(得分:0)

http级别像这样声明map

map $http_user_agent $ignore_status_checks {
    default                 0;
    "~Pingdom.*"            1;
    "~*\(StatusCake\)"      1;
    "~*mod_pagespeed*"      1;
    "~*NodePing*"           1;
}

然后在您的server的{​​{1}}块中添加:

location

这将关闭if ($ignore_status_checks) { access_log off; } ,因为在access_log中返回1的任何内容。当然,您可以在map中随心所欲。