2017-10-19 168 views
0

我目前正在使用Nginx的圖像緩存服務器上,但是我運行到問題越來越Nginx的服務在緩存圖像

緩存服務器應該能夠提供兩種圖像,首先是相當小的圖像,這些圖像幾乎不需要來自圖像服務器的干擾。

這工作我想要的方式來使用以下配置:

location = /small/ { 
    try_files /small/logos/$arg_id.jpg @gen_script; 
} 
location @gen_script { 
    rewrite ^(.*)$ /small/index.php?id=$arg_id; 
} 

沒有問題在這裏,使用這個配置它試圖找到圖像中的目錄/small/logos與匹配所提供的ID-parameter的名稱,如果它不存在,則表示@gen_script,即導致生成圖像的index.php。這工作沒有問題。

現在因爲這是給我找麻煩部分,第二類圖像服務器應該服務的是一般較大和基於多個參數(height, width, that sort of thing)創建。

這些圖像是可識別的一個生成的散列它總是128 characters long

我想要實現的是哈希的前三個字符都變成了在圖像可以找到路徑的目錄,其次是完整哈希和「.JPG」。以下是一個方面,它不工作配置和我的想法,爲什麼:

location ~* "^\/image\.php\?hash=(?<a>.{1})(?<b>.{1})(?<c>.{1})(?<d>.{125})(?:.+)$" { 
    try_files /images/$a/$b/$c/$a$b$c$d.jpg @image_gen; 
} 
location @image_gen { 
    rewrite ^(.*)$ /image.php$is_args$args; 
} 

在預期行爲image.php每個請求實際上是由接收(或發送至)對比image.php ,再次創建請求的圖像,完全與(或任何...)高速緩存服務器應該做的對比

爲了便於說明,如果散列值爲abcde12345(出於可讀性的原因而縮短),那麼圖片將位於/images/a/b/c/abcde12345.jpg中。 如何確保try_files檢查文件是否存在於預期的子目錄結構中,並且如果它沒有將原始請求轉發到/image.php及其參數,確保生成映像?

+0

您無法測試'location'表達式中的參數。 'location'和'rewrite'指令使用規範化的URI,它不包含'?'及其後的任何內容。 –

+0

@RichardSmith這是有道理的,一個參數不是一個位置。如果我將'location〜* ...'更改爲'location =/image.php',我可以在位置塊內的if語句中將$ arg_hash正則表達式嗎?或者它應該是另一種方式? – Rodent85

+0

你可以使用'if',但是你不能使用'try_files'。你堅持使用'/image.php?hash ='風格的請求嗎? –

回答

0

您可以使用類似下面

http { 

    map $arg_hash $arg_hash_folder { 

     default ''; 
     ~*(.)(.)(.)(.*)$ /$1/$2/$3/$1$2$3$4.jpg; 
    } 

    server { 

     location = /image.php { 

      try_files $arg_hash_folder @process_image; 
     } 

     location @process_image { 

      # Try rewrite here and see if it works 
      # If it doesn't work then you should have the php processing code here 
      # fastcgi_pass ....; 
     } 
    } 
} 

的地圖會給你的文件夾路徑,如果沒有找到它的process_image將被調用,在這裏你可以嘗試改寫,我有我的懷疑會工作,所以您將需要再次在這裏包含PHP處理代碼