nginx静态图像后备

时间:2015-06-04 15:37:50

标签: nginx static-files fallback

我使用nginx 1.6.2来提供文件夹中的静态图像。如果存在或回退到默认图像,我需要提供所请求的文件。

我有这个位置块

location /test/img/ {
    rewrite  ^/test/img/(.*)  /$1 break;
    root   /path/to/folder/images;
    try_files $uri /default.jpg;
}

" / path / to / folder / images"文件夹包含2个文件:image1.jpg和default.jpg。 如果我请求现有图像,则一切正常。例如,如果我对此网址进行GET

<host_name>/test/img/image1.jpg

我可以看到正确的图像,但如果我搜索未知图像,我会得到404响应。 从error.log文件中我可以看到此错误:

[error] 18128#0: *1 open() "/etc/nginx/html/default.jpg" failed (2: No such file or directory)

为什么nginx在该文件夹中搜索default.jpg?我希望在位置块的根目录中搜索该文件。我尝试使用绝对路径没有成功。 提前谢谢。

2 个答案:

答案 0 :(得分:5)

try_files最后一个参数会导致内部重定向。因此,nginx就像使用URI /default.jpg调用它一样,并且不会转到/test/img/

但是您可以使用alias指令轻松修复问题而无需重写。

location /test/img/ {
    alias /path/to/folder/images/;
    try_files $uri default.jpg =404;
}

测试配置

server {
    listen 127.0.0.1:8888;
    location /test/img/ {
        alias /var/tmp/site/images/;
        try_files $uri default.jpg =404;
        error_log /var/log/nginx/error.log debug;
    }
}

请求:

curl localhost:8888/test/img/image.jpg
curl localhost:8888/test/img/non-existent.jpg

调试日志:

... for image.jpg
2015/06/05 12:16:53 [debug] 4299#0: *5 try files phase: 14
2015/06/05 12:16:53 [debug] 4299#0: *5 http script var: "/test/img/image.jpg"
2015/06/05 12:16:53 [debug] 4299#0: *5 trying to use file: "image.jpg" "/var/tmp/site/images/image.jpg"
2015/06/05 12:16:53 [debug] 4299#0: *5 try file uri: "/test/img/image.jpg"

... for non-existent.jpg
2015/06/05 12:15:50 [debug] 4299#0: *4 try files phase: 14
2015/06/05 12:15:50 [debug] 4299#0: *4 http script var: "/test/img/non-existent.jpg"
2015/06/05 12:15:50 [debug] 4299#0: *4 trying to use file: "non-existent.jpg" "/var/tmp/site/images/non-existent.jpg"
2015/06/05 12:15:50 [debug] 4299#0: *4 trying to use file: "default.jpg" "/var/tmp/site/images/default.jpg"
2015/06/05 12:15:50 [debug] 4299#0: *4 try file uri: "/test/img/default.jpg"

答案 1 :(得分:0)

我找到了解决方案。 如果在根文件夹中找不到任何文件,则nginx会重定向到与try_files指令的最后一个参数对应的url。 所以正确的块是

location /test/img/ {
    rewrite  ^/test/img/(.*)  /$1 break;
    root   /path/to/folder/images;
    try_files $uri /test/img/default.jpg;
}