我目前正在使用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
及其參數,確保生成映像?
您無法測試'location'表達式中的參數。 'location'和'rewrite'指令使用規範化的URI,它不包含'?'及其後的任何內容。 –
@RichardSmith這是有道理的,一個參數不是一個位置。如果我將'location〜* ...'更改爲'location =/image.php',我可以在位置塊內的if語句中將$ arg_hash正則表達式嗎?或者它應該是另一種方式? – Rodent85
你可以使用'if',但是你不能使用'try_files'。你堅持使用'/image.php?hash ='風格的請求嗎? –