nginx 配置图片服务器技巧

来源:互联网 发布:linux查看日志文件 编辑:程序博客网 时间:2024/05/16 10:57

应用场景:
uploads目录是用来存放上传到服务器的图片文件的根目录,在根目录下可能存在分类的文件夹,在这些文件夹中存放原始图片例如src.jpg, 同时可能存在该图片的对应的小图s_src.jpg。
假设uploads下的busipic文件夹下有a.jpg,s_a.jpg,b.jpg,default.jpg,servername为www.exam.com
如果访问www.exam.com/uploads/busipic/s_a.jpg返回www.exam.com/uploads/busipic/s_a.jpg,
访问www.exam.com/uploads/busipic/s_b.jpg返回www.exam.com/uploads/busipic/b.jpg,
访问www.exam.com/uploads/busipic/b.jpg返回www.exam.com/uploads/busipic/b.jpg,
访问www.exam.com/uploads/busipic/s_aaa.jpg返回www.exam.com/uploads/busipic/default.jpg
访问www.exam.com/uploads/busipic/返回www.exam.com/uploads/busipic/default.jpg
访问www.exam.com/uploads/busipic/dfdf.jpg返回www.exam.com/uploads/busipic/default.jpg



#访问小图
location ~ ^/uploads/(.*)?/s_.*$ {
    root html;

    if (!-f $request_filename) {            #小图片不存在情况       
    rewrite ^(/uploads/.*/)s_(.*)$ $1$2 last;    #去掉url中的s_,使其访问大图,注意此处必须用last,不能用break,因为last会对server标签重新发起请求,而break就直接使用当前的location中的数据源来访问

    }
}


#访问原图,如果原图片不存在,就给出当前目录下的缺省图片,要是当前目录下没有缺省图片,就返回指定目录下的缺省图片(确保指定目录目录存在该文件)
#原图对应的小图是以s_加上原图名字
location ~ ^/uploads/busipic {           
    root html;
    index default.jpg;               

    if (!-f $request_filename) {            #原图片不存在,返回前当目录下的缺省图片
    rewrite ^(/uploads/.*/).*$ $1default.jpg break;
    }

    error_page 404 =200 /default.jpg;        #当目录下的缺省图片不存在时,返回一个指定的缺省文件,确保存在此文件,否则可能进入死循环 注意(404 =200)404后有一个空格,要不然配置会报错,这样的配置是把客户端看到的404 改为200
}




干净的配置项

location ~ ^/uploads/(.*)?/s_.*$ {
    root html;
    index default.jpg;

    if (!-f $request_filename) {
    rewrite ^(/uploads/.*/)s_(.*)$ $1$2 last;

    }
}

location ~ ^/uploads/busipic {
    root html;
    index default.jpg;

    if (!-f $request_filename) {
    rewrite ^(/uploads/.*/).*$ $1default.jpg break;

    }

    error_page 404 =200 /test/default.jpg;

    log_format main2 '$status ' '"$request_filename" no s_';
    access_log  logs/host.log  main2;
}