我想禁用特定用户代理的日志记录。这是我当前的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;
}
我可以将两个位置摘要合并为一个吗?或者我该如何进行?
答案 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
中随心所欲。