Nginx的try_files不直接记录404日志,需通过命名location(如@not_found)捕获最终失败请求,在其中配置access_log和return 404,才能精准记录未找到文件的请求;不可用=404结尾,否则绕过location无法日志。

Nginx 的 try_files 本身不直接记录“未找到文件”的日志,它只是按顺序检查文件或路径是否存在,并跳转到指定的后备处理(如 @fallback 或内部 URI)。真正能捕获并记录 404(文件未找到)的关键,在于**把最终失败的请求导向一个明确的处理位置(比如命名 location),并在该位置返回 404 同时触发自定义日志**。
1. 用命名 location 捕获最终失败
在 try_files 中,最后一个参数应指向一个 @named_location,而不是直接写 /404.html 这类外部路径。这样你才能在该 location 内统一控制响应和日志行为:
location / {
try_files $uri $uri/ @not_found;
}
<p>location @not_found {</p><h1>此处就是所有 try_files 都失败后进入的地方</h1><pre class="brush:php;toolbar:false;"><code>return 404;}
2. 在命名 location 中启用独立 access_log
默认 access log 记录的是原始请求(如 GET /abc.js),但如果你只关心被 try_files 判定为“不存在”的请求,就在 @not_found 里单独加一行 access_log,指向专用日志文件:
location @not_found {
access_log /var/log/nginx/try_files_404.log main; # 自定义日志路径
return 404;
}这样只有真正落到 @not_found 的请求才会写入该日志,避免混入其他 404(比如直接访问不存在的 PHP 脚本)。
3. 可选:记录具体哪个路径没找到
如果想看到是 $uri 还是 $uri/ 导致失败,可以在命名 location 中用 log_format 扩展变量。先定义带变量的日志格式:
log_format try_files_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'missed="$uri";'然后在 @not_found 中使用它:
location @not_found {
access_log /var/log/nginx/try_files_404.log try_files_log;
return 404;
}日志行末尾会显示类似 missed="/static/js/app.min.js";,清晰定位缺失资源。
4. 注意事项
-
不要在
try_files最后写=404—— 它会直接返回 404,不进任何 location,无法加日志。 -
确保
@not_found是内部 location(以@开头),不能被外部请求直接访问。 - 如果用了
alias或root,要确认$uri解析后的物理路径确实不存在,否则不会走到@not_found。 - 日志文件路径需保证 Nginx worker 进程有写权限,否则日志静默丢失。


















