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