2009-10-22 56 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