在露营中,如何最好地提供静态文件,例如css?
现在我有
class Style < R '/cards.css'
def get
@headers["Content-Type"] = "text/css"
File.read('cards.css')
end
end
是否有更聪明的方式涉及Rack?
答案 0 :(得分:8)
露营当前(记得从RubyGems安装最新版本!)静态文件的立场是服务器应该负责提供静态文件。
如果您使用camping
- 命令,则应自动为您提供public/
- 目录。只需将cards.css
移动到public/cards.css
,localhost:3301 / cards.css就会返回该文件。
在制作中,您应该直接从public/
目录配置Apache / Nginx /其他任何文件。
如果您无法配置Apache / Nginx(例如在Heroku中),您可以编写这样的自定义config.ru:
# Your Camping app:
app = MyApp
# Static files:
files = Rack::File.new('public')
# First try the static files, then "fallback" to the app
run Rack::Cascade.new([files, app], [405, 404, 403])
(这就是Camping :: Server在内部执行的操作:https://github.com/camping/camping/blob/5201b49b753fe29dc3d2e96405d724bcaa7ad7d4/lib/camping/server.rb#L151)
对于小文件,您可以将它们存储在app.rb的DATA块中:https://github.com/camping/camping/blob/5201b49b753fe29dc3d2e96405d724bcaa7ad7d4/test/app_file.rb#L37
如果您想将所有内容保存在一个文件中,这也很有用。
Camping.goes :Foo
__END__
@@ /cards.css
...
Camping将使用文件扩展名设置正确的Content-Type。
此外,最新版本的Camping有一个serve
- 方法,可以为您处理Content-Type。您可以将控制器简化为:
class Style < R '/style.css'
def get
serve "cards.css", File.read("cards.css")
end
end
我不得不为糟糕的文件道歉。现在你
答案 1 :(得分:1)
这是一个suggestion,最初由whytheluckystiff:
class Static < R '/static/(.+)'
MIME_TYPES = {
'.html' => 'text/html',
'.css' => 'text/css',
'.js' => 'text/javascript',
'.jpg' => 'image/jpeg',
'.gif' => 'image/gif'
}
PATH = File.expand_path(File.dirname(@__FILE__@))
def get(path)
@headers['Content-Type'] = MIME_TYPES[path[/\.\w+$/, 0]] || "text/plain"
unless path.include? ".." # prevent directory traversal attacks
@headers['X-Sendfile'] = "#{PATH}/static/#{path}"
else
@status = "403"
"403 - Invalid path"
end
end
end
PS - 实际上,您可以找到其他一些好主意here,例如文件上传,会话等。