排查 nginx 中 rewrite 导致静态资源 404 的核心在于确认请求路径是否被错误地重定向到了不存在的物理文件。通常是因为正则表达式匹配了不该匹配的 url,或者重写后的目标路径缺少了必要的目录前缀(如 /static/)。解决思路是检查 rewrite 规则的正则捕获组是否正确提取了资源路径,并确保最终指向的 root 目录下存在对应的文件。

rewrite 规则如何影响静态资源的实际访问路径
当 Nginx 执行 rewrite 指令时,它会修改内部请求 URI。如果规则配置不当,原本指向 /images/logo.png 的请求可能被重写为 /assets/images/logo.png 或 /logo.png。若服务器配置的 root 目录结构中没有对应的子目录,Nginx 就会返回 404。关键在于理解 rewrite 只是改变了 URI,而 root 指令决定了从磁盘哪个绝对路径开始查找该 URI。

server {
listen 80;
server_name example.com;
# 错误的配置示例:将 /img/xxx 重写为 /xxx
# 假设 root 为 /var/www/html
# 请求 /img/logo.png -> 重写为 /logo.png
# Nginx 尝试查找 /var/www/html/logo.png (不存在) -> 404
location /img/ {
rewrite ^/img/(.*)$ /$1 break;
root /var/www/html;
}
# 正确的配置示例:保留路径结构
location /static/ {
alias /var/www/static_files/;
}
}alias 与 root 在重写场景下的行为差异
在处理静态资源时,root 和 alias 的行为极易混淆。使用 root 时,Nginx 会将 location 路径追加到 root 路径后;而使用 alias 时,location 路径会被完全替换为 alias 指定的路径。如果在 rewrite 后使用了 root,务必确保重写后的 URI 加上 root 路径后能对应到真实文件。对于静态资源,推荐使用 alias 配合精确的 location 匹配,以避免因 rewrite 导致的目录拼接错误。

# 使用 alias 的正确方式
location /static/ {
alias /var/www/static_files/;
# 请求 /static/css/style.css
# 直接映射到 /var/www/static_files/css/style.css
}
# 避免在 alias 块中使用复杂的 rewrite
# 因为 alias 已经处理了路径映射,额外的 rewrite 可能导致路径双重变化
location /api/v1/ {
proxy_pass http://backend;
# 这里不需要 rewrite,proxy_pass 会自动处理
}如何通过日志定位具体的 404 原因
当出现 404 时,查看 Nginx 的 access.log 和 error.log 是最直接的排查手段。access.log 记录了客户端发起的原始请求 URI,而 error.log 会记录 Nginx 内部处理后的最终尝试路径及失败原因。通过对比两者,可以判断 rewrite 是否生效以及是否导致了路径偏移。例如,如果 access.log 显示请求 /img/test.jpg,而 error.log 提示找不到 /var/www/html/test.jpg,则说明 rewrite 规则成功去掉了 /img/ 前缀,但目标文件中确实不存在该文件,或者 root 配置有误。


















