核心问题是alias路径拼接逻辑错误:alias完全替换location匹配部分,而非追加,必须确保location和alias末尾均带斜杠,且路径大小写、权限、selinux及nginx版本兼容性均正确。

用 alias 访问图片返回 404,核心问题通常是路径拼接不匹配——Nginx 不像 root 那样自动拼接 location 路径,而是直接用 alias 后的值替换整个 location 匹配部分,稍有偏差就 404。
确认 alias 路径是否精确覆盖 location 匹配段
alias 的行为是:把 location 中匹配到的部分“完全替换”为 alias 指定的目录。比如:
-
location /images/ { alias /data/pics/; }→ 请求/images/cat.jpg会查找/data/pics/cat.jpg -
location /images { alias /data/pics/; }(末尾没斜杠)→ 请求/images/cat.jpg会查找/data/picscat.jpg(少了个 /,直接连写!) -
location /images/ { alias /data/pics; }(alias 末尾没斜杠)→ 请求/images/cat.jpg会查找/data/picscat.jpg(同样错)
✅ 正确写法必须两端都带斜杠:location /images/ { alias /data/pics/; }
检查文件系统路径是否存在且 Nginx 有读取权限
即使配置语法正确,Linux 权限或路径不存在也会 404(不是 403):
- 用
ls -l /data/pics/cat.jpg确认文件真实存在 - 确认 Nginx 工作进程用户(如
www-data或nginx)对/data/pics/及其父目录有x(执行/进入目录)和r(读文件)权限 - 特别注意:父目录(如
/data)若无x权限,Nginx 根本进不去/data/pics/,直接 404
验证是否被其他 location 或 rewrite 干扰
Nginx 按照 location 匹配优先级处理请求,容易被覆盖:
- 检查是否有更具体的
location ~ \.jpg$ { ... }或正则 location 提前终止了流程 - 确认没有
rewrite把图片路径重写了,导致最终查找路径变样 - 临时注释掉其他 location 块,只留 alias 配置,做最小化测试
开启 error_log 查看具体失败原因
在 server 或 http 块中加一行:error_log /var/log/nginx/image_debug.log debug;,然后访问图片,查看日志里类似:
这条信息会明确告诉你 Nginx 实际尝试打开的路径,是最直接的排查依据。











