我已经解决了许多有趣的路由问题——将请求 URL 转换为哈希等,但出于好奇,有没有办法告诉路由系统你想要某个 url 下的任何东西从字面上提供子路径 - 无需通过控制器?
例如,如果我有 /home/me/public_html/rails_proj/images/foo.jpg 和 .../rails_proj/images/other/bar.jpg,我可以插入一条路线,上面写着“图像下的任何东西都应该是作为默认 mime 类型的对象?”
可能很有趣。
我已经解决了许多有趣的路由问题——将请求 URL 转换为哈希等,但出于好奇,有没有办法告诉路由系统你想要某个 url 下的任何东西从字面上提供子路径 - 无需通过控制器?
例如,如果我有 /home/me/public_html/rails_proj/images/foo.jpg 和 .../rails_proj/images/other/bar.jpg,我可以插入一条路线,上面写着“图像下的任何东西都应该是作为默认 mime 类型的对象?”
可能很有趣。
如果将“images”目录放入 Rails 应用程序的“public”文件夹(例如:/public/images/),那么 MIME 类型应该不会有任何问题,除非您的 Web 服务器配置错误。
根据您的示例,您希望应用程序根目录中的图像目录。我不认为 Rails 有办法让这些图像可见,但如果你真的想要,你可以使用 mod_rewrite 让它工作。再一次,由网络服务器来确保图像具有正确的 MIME 类型。
从公共目录提供的东西不会通过 Rails - 它们只会由您的服务器(可能是 apache)处理。您需要通过 rails 系统提供图像的唯一原因是您想要对谁可以访问它们进行某种控制。只需将其他所有内容公开并访问 ala:siteurl.whatever/images/*.jpg
我通常使用 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 应用程序。
我认为解决这个问题最简单的方法就是使用 image_path 辅助方法,它为您提供要在视图中显示的图像的路径。例如,如果你想引用 /assets/images/logo.png 下的 logo.png,你可以使用 image_path('logo.png')。
警告:如果您的请求 URL 匹配静态资源 WEBrick、mongrel 或任何会很乐意为它服务的东西。无论如何,您都不希望在生产环境中出现这种情况:如果您的流量足够高,您的应用程序将因为它的杂种将忙于提供静态内容而陷入瘫痪。
因此,请确保您的 Web 服务器已正确配置为适用于之前评论者指出的各种静态内容。