最近有個(gè)需求,客戶端向服務(wù)器請(qǐng)求圖片時(shí),可以帶get參數(shù)請(qǐng)求想要的縮略圖,例如http://www.xxxxx.com/Upload/img//1de23275134663.jpg?size=100x100;
剛開(kāi)始想法是用php的圖片類來(lái)處理,在客服端請(qǐng)求圖片時(shí),nginx上用正則判斷url是否請(qǐng)求縮略圖的形式,如果是則rewrite到接口去處理生成縮略圖;
后來(lái)在谷歌看了一些相關(guān)文檔后,其實(shí)可以用nginx的的 image_filter模塊來(lái)處理;如果nginx上沒(méi)有安裝該模塊的,可以谷歌看下攻略進(jìn)行安裝。
首先要做的是用正則去匹配url為圖片請(qǐng)求的并帶有縮略圖參數(shù)的才能走進(jìn)區(qū)間。
第一個(gè)注意的是由于location只匹配URI,不可以匹配get參數(shù),所以?號(hào)就不能匹配了,就把?換成!,這樣才能精準(zhǔn)的去匹配,也就是客戶端請(qǐng)求的url要為:
http://www.xxxxx.com/Upload/img//1de23275134663.jpg!size=100x100;
第二個(gè)注意的是Nginx不支持在if {}這個(gè) block 里面用image_filter函數(shù),image_filter 的第一個(gè)參數(shù)resize/crop也不能用變量的方式傳輸。
由于這條請(qǐng)求的文件是不存在的,所以需要處理后proxy到本機(jī)網(wǎng)址127.0.0.1 rewrite到正常請(qǐng)求url,所以需要在配置文件增加:
server {
? ? listen 127.0.0.1:80;
? ? server_name 127.0.0.1;? ?
# 正則匹配? ? location
~* ^(.*\.(?:jpg|gif|png|jpeg|bmp))!{
# 重寫到正常的圖片url? ? ? rewrite
^(.*\.(?:jpg|gif|png))! $1;
? ? }
}
image_filter具體配置如下:
# 正則匹配
location ~* \.(?:jpg|gif|png|jpeg|bmp)!size=(.*)$ {
# 設(shè)置變量來(lái)裝$1
? ? ? set$img_arg $1;
? ? ? if($img_arg ~"^(\d+)x(\d+)") {
? ? ? ? ? set$img_width $1;
? ? ? ? ? set$img_height $2;
? ? ? ? }
? ? ? ? if($img_arg ~"^(\d+)$") {
? ? ? ? ? set$img_width $1;
? ? ? ? ? set$img_height"-";
? ? ? ? }
? ? ? ? if($img_arg ~"^x(\d+)") {
? ? ? ? ? set$img_width"-";
? ? ? ? ? set$img_height $1;
? ? ? ? }
? ? ? ? proxy_pass http://127.0.0.1:80;
# 寬度與高度想使用圖片原有參數(shù),可設(shè)置為“-”? ? ? ? image_filter crop $img_width $img_height;
? ? }
基本配置已經(jīng)完成,需要設(shè)置cache的可以通過(guò)參數(shù)去設(shè)置;有什么不足之處請(qǐng)各位大神指教,好了,電腦得還給包工頭了,我得搬磚去了。
參考文章:
1.http://nginx.org/en/docs/http/ngx_http_image_filter_module.html
2.https://www.centos.bz/2017/03/using-nginx-image_filter-resize-images/
3.http://www.dnsdizhi.com/post-252.html