1

所以,我有一个 sinatra 应用程序,我正在使用该应用程序为客户托管几个不同的微型站点。我的 public 和 views 目录的结构是这样的:

sites/
  site1/
    public/
      style.css
    views/
      layout.haml
      general.haml
  site2/
    public/
      style.css
    views/
      layout.haml
      general.haml

现在,当请求进来时,我有以下两行:

set :views, Proc.new { File.join(root, "sites/#{site}/views") }
set :public, Proc.new { File.join(root, "sites/#{site}/public") }

当传入请求进来并且站点被定义为“site1”时,视图会完全按照需要工作,它们会从相应的文件夹中呈现出来。但是,调用“/style.css”路由会返回 404 错误。

当我在应用程序根目录中创建公共目录并将 style.css 放在那里时,它工作正常。但是,我需要这个在逐个站点的基础上工作。我要关闭Sinatra 的官方文档,但它仍然无法正常工作,即使我设置了

enable :static

或者如果我使用

set :static, true

如文档中所述。有任何想法吗?

4

1 回答 1

0

我想这与您的设置方式有关sitesite如果我正确理解您的要求,我相信您会想在您的应用程序上创建一个方法而不是静态设置。这个例子做到了这一点,并按预期工作:

class Test < Sinatra::Base
  set :public, Proc.new { File.join(site, "public") }
  set :static, true

  register do
    def site
      ["x", "y", "z"][rand * 3]
    end
  end

  get "/" do
    settings.public
  end
end

但是,我不确定 Sinatra 是否旨在以这种方式提供静态文件,并且无论如何可能有更好的解决方案可用。例如,您可以完全在 Nginx 或 Apache 中完成此操作,完全无需让 Sinatra 提供静态文件。

于 2011-04-02T09:14:55.017 回答