首先,有这样一个需求:一个系统的图片存储是放在upyun上的,现在有个客户需要本地化部署,所以需要将图片进行本地存储。为了兼容,图片存储的路径格式保持和在upyun上的存储路径一致。在upyun上的存储路径是这样的(客户id/日期/longtime_图片名)
http://up.***.com/accountid/20160505/1462419931818_qq.png
图片上传到本地D盘响应的文件夹下,用nginx做代理,可以访问图片地址。配置下nginx
location /img {
alias D:/;
}
可以通过127.0.0.1/img/accountid/1462419931818_qq.png访问图片。
然后,upyun提供了一项缩略图的功能,就是在图片url地址后面加"!w50h50"(width:50px,height:50px)。这是再通过127.0.0.1/img/accountid/1462419931818_qq.png!w50h50就访问不了了。所以,为了使以前带缩略图表示的url地址也能访问,需要对"!"后面的地址进行过滤。在nginx中进行这样的配置
if ($request_uri ~* "^(.*)!(.*)$") {
rewrite ^(.*) $1 last;
#last会重新请求server
}
这样配置之后,127.0.0.1/img/accountid/1462419931818_qq.png!w50h50就可以访问了。但是如果图片地址中含有中文,比如127.0.0.1/img/accountid/1462419931818_中文.png!w50h50还是会404.查看error.log,发现nginx对url地址进行了两次编码,即第一次访问时地址是127.0.0.1/img/accountid/1462419931818_%e4%b8%ad%e6%96%87.png!w50h50,过滤之后重新访问server,nginx又对url进行了encode,地址变为127.0.0.1/img/accountid/1462419931818_%25e4%25b8%25ad%25e6%2596%2587.png。
此时,应该使用代理设置,代理不会对url进行encode,配置如下
location /img {
if ($request_uri ~* "^(.*)!(.*)$") {
proxy_pass http://127.0.0.1/$1;
}
alias D:/;
}