log_not_found off的核心作用是静默“文件未找到”类warn日志,不改变404响应、不影响access_log记录,仅屏蔽try_files/alias/root查找失败触发的日志,不干预500/403等真实错误。

log_not_found off 的核心作用是静默“文件未找到”类 warn 日志,不改变响应行为,也不影响 access_log。关键在于按需、精准、分层配置,而不是全局关闭。
只在真正需要的位置关闭
它只对由 try_files、alias、root 查找静态文件失败触发的 404 日志生效,比如:
open() "/var/www/app/logo.png" failed (2: No such file or directory)stat() "/var/www/app/js/app.abc123.js" failed
不会屏蔽 500、403、上游超时、权限错误等真实异常——这些仍会正常记入 error_log。
推荐的三类典型配置位置
1. SPA 主路由 fallback 场景(如 Vue/React history 模式)
浏览器访问 /user/profile,Nginx 先查文件 → 失败 → 记日志 → 再 fallback 到 /index.html。中间的“查不到”就是干扰源:
location / {
log_not_found off;
try_files $uri $uri/ /index.html;
}
2. 静态资源后缀匹配(最常用、最安全)
专用于 .js/.css/.png/.ico 等构建产物,避免哈希变更、清理旧文件引发日志风暴:
location ~* \.(js|css|png|jpg|gif|ico|svg|woff2?|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
log_not_found off;
}
3. 明确路径的高频干扰项(如 favicon.ico)
用精确匹配 + 空响应,效率高、无副作用:
location = /favicon.ico {
log_not_found off;
access_log off;
return 204;
}
必须避开的误区
- 不要在
http块设log_not_found off—— 会全局屏蔽所有 location 的“找不到”日志,掩盖真实路径错误或 alias 配置失误 - 不要和
error_log off混淆 —— 后者是语法错误,实际会新建一个叫 “off” 的日志文件 - 不要依赖它来“隐藏 404” —— 它不改变 HTTP 状态码,浏览器仍收到 404 或你指定的 204;真正缺失的资源仍需修复
配合 access_log 更进一步
log_not_found off 只管 error_log,不影响 access_log 中的 404 记录。若还需过滤某些路径(如 /healthz、/robots.txt)的访问日志,可用 map 实现条件记录:
map $request_uri $log_404 {
~^/(healthz|robots\.txt|favicon\.ico) 0;
default 1;
}
access_log /var/log/nginx/access.log main if=$log_404;
这样 error_log 干净,access_log 也只保留有价值的部分。











