nginx解析帶中文的url重定向之后404問題


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

 

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM