首先,有這樣一個需求:一個系統的圖片存儲是放在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:/;
}
