2009-10-22 85 views
1

我有一個Rails應用程序,它可以生成大量圖像;即帶有show動作的圖像控制器從SAN獲取圖像並提供服務。我有一個caches_page可以在自定義位置可靠地保存文件的副本; RAILS_ROOT +/public/cache。這些文件在那裏,看起來很好。配置nginx提供緩存圖像

我通過nginx提供的應用程序,它似乎工作正常,但對於我的生活我無法讓它發送這些緩存的圖像文件,而不是擊中rails的行動。我對nginx非常陌生,並且一直在研究它一段時間,但無論我嘗試什麼都行不通 - 我正在做一些根本錯誤的事情。

爲了澄清,我有一個這樣的URI:

/images/show/123.jpg 

該文件可能存在的位置:

/cache/images/show/123.jpg 

我怎樣才能讓nginx的服務該文件並沒有通過在要求?

這裏是什麼,我已經試過一個不完整的列表:

if (-f /cache$request_filename) { 
    rewrite (.*) /cache$1 break; 
    break; 
} 

if (-f /cache$uri.jpg) { 
rewrite (.*) /cache$1.jpg break; 
} 

if (-f /cache/images/show/$request_filename) { 
rewrite (.*) /cache/images/show/$1.jpg break; 
} 

任何想法?

更新:我回答了我自己的問題。正確的規則是:

 if (-f $document_root/cache$request_uri) { 
     rewrite (.*) /cache$1 break; 
     } 
+0

http://serverfault.com/questions/262995/how-do-i-dry-up-this-nginx配置/ 263854#263854 http://serverfault.com/questions/263223/nginx-serve-htm-if-exists-instead-of-php/263395#263395 – 2011-05-05 11:39:04

回答

3

爲nginx的推薦的方法是使用 the "try_files" directive

location /images/show { 
    try_files $document_root/cache$uri; 
} 
+1

'try_files'是一種很好的方法(比if )但是我認爲這個指令應該是'try_files $ document_root/cache $ uri $ uri;'所以如果找不到緩存的圖像,它會回退到請求的uir。 – myanimal 2012-12-18 16:36:17