Rails:提供静态资产的路由(如.jpgs等?)

我已经解决了许多有趣的路由问题 – 将请求URL转换为哈希等等,但出于好奇,有没有办法告诉路由系统你想要任何属于某个url的东西字面上要服务的子路径 – 不通过控制器?

例如,如果我有/home/me/public_html/rails_proj/images/foo.jpg和… / rails_proj / images / other / bar.jpg,我可以插入一条说“图像下的任何内容应该只是作为默认mime类型的对象?“

可能很有趣。

从公共目录提供的东西不会通过Rails – 它们只会由您的服务器(可能是apache)处理。 您需要通过rails系统提供图像的唯一原因是,您希望对谁可以访问它们进行某种控制。 只需将其他所有内容公开并访问ala:siteurl.whatever / images / * .jpg

我通常使用nginx作为前端,使用Apache / Passenger作为后端。 Ngingx代理所有对Apache的Rails请求,但处理所有静态内容本身。 查看英文nginx wiki上的示例。 这是nginx配置的一小段摘录:

server { listen 80; server_name www.domain.com; location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|js)$ { root /path/to/static/assets/dir; } location / { proxy_pass http://127.0.0.1:81; } } 

因此,让apache侦听端口81以处理由nginx代理的Rails请求,并让nginx传递静态内容。 在提供静态内容时,nginx不仅比Apache更快,而且还可以为每个图像,样式表,javascript或其他任何静态内容卸载Rails应用程序。

我认为解决这个问题的最简单方法就是使用image_path辅助方法,它为您提供要在视图中显示的图像的路径。 例如,如果要在/assets/images/logo.png下引用logo.png,则可以使用image_path(’logo.png’)。

警告:如果您的请求URL与静态资源WEBrick匹配,那么mongrel或其他任何东西都会很乐意为它服务。 不惜任何代价,你不希望这个在生产中:如果你的流量足够高,你的应用程序就会因为它的杂种忙于提供静态内容而受到挫折。

因此,请确保您的Web服务器已正确配置为各种静态内容,如前面的评论者所指出的那样。