如何提供静态文件?(CSS)

5
在Camping中,如何最好地提供静态文件,例如css文件?
现在我有这样的代码:
class Style < R '/cards.css'
    def get
         @headers["Content-Type"] = "text/css"
         File.read('cards.css')
    end
end 

有没有使用Rack更聪明的方法呢?

2个回答

9

对于静态文件,Camping(请记得从RubyGems安装最新版本!)目前的立场是由服务器来负责提供静态文件。

如果您使用camping命令,那么public/目录应该会自动为您提供服务。只需将cards.css移动到public/cards.css中,localhost:3301/cards.css就可以返回该文件。

在生产环境中,您应该配置Apache/Nginx/其他服务器直接从public/目录提供文件。


如果您无法配置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])

(This is what Camping::Server does internally: 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
...

露营将使用文件扩展名来设置正确的Content-Type。
此外,Camping的最新版本拥有一个serve方法,可为您处理Content-Type。您可以简化您的控制器如下:
class Style < R '/style.css'
  def get
    serve "cards.css", File.read("cards.css")
  end
end

我必须为糟糕的文档而道歉。暂时你需要:


非常感谢您的分享!我已经搜索了很长时间才找到这个答案。您是从哪里学习到public目录的,又是从哪里发现Camping会从该目录提供静态文件呢?在《The Camping Book》中我找不到任何相关资料。 - IIllIIll

2
下面是一个建议,最初由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- 其实,你还可以在这里找到一些其他的好主意,例如文件上传、会话等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接