14

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

例如,如果我有 /home/me/public_html/rails_proj/images/foo.jpg 和 .../rails_proj/images/other/bar.jpg,我可以插入一条路线,上面写着“图像下的任何东西都应该是作为默认 mime 类型的对象?”

可能很有趣。

4

5 回答 5

16

如果将“images”目录放入 Rails 应用程序的“public”文件夹(例如:/public/images/),那么 MIME 类型应该不会有任何问题,除非您的 Web 服务器配置错误。

根据您的示例,您希望应用程序根目录中的图像目录。我不认为 Rails 有办法让这些图像可见,但如果你真的想要,你可以使用 mod_rewrite 让它工作。再一次,由网络服务器来确保图像具有正确的 MIME 类型。

于 2009-02-10T06:34:46.280 回答
6

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

于 2009-02-10T06:36:58.113 回答
5

我通常使用 nginx 作为前端,使用 Apache/Passenger 作为后端。Ngingx 代理所有 Rails 对 Apache 的请求,但自己处理所有静态内容。查看英文 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 应用程序。

于 2009-02-11T08:41:22.933 回答
3

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

于 2012-07-17T14:35:03.220 回答
1

警告:如果您的请求 URL 匹配静态资源 WEBrick、mongrel 或任何会很乐意为它服务的东西。无论如何,您都不希望在生产环境中出现这种情况:如果您的流量足够高,您的应用程序将因为它的杂种将忙于提供静态内容而陷入瘫痪。

因此,请确保您的 Web 服务器已正确配置为适用于之前评论者指出的各种静态内容。

于 2009-02-10T20:24:49.333 回答