【问题标题】:How to setup URLs for static site with Ruby Rack on Heroku如何在 Heroku 上使用 Ruby Rack 为静态站点设置 URL
【发布时间】:2012-10-23 18:21:22
【问题描述】:

我的网站是here

它曾经是一个 Django 驱动的博客。但是我不再更新它,所以我只想让它成为一个静态 HTML 站点。我使用 Ruby Rack 将其 wget'ed 并移至 Heroku。

但是,每个 URL 都会解析为主页。这是因为我的 config.ru 文件:

use Rack::Static, 
  :urls => ["/media/images", "/media/js", "/media/css"],
  :root => "public"

run lambda { |env|
  [
    200, 
    {
      'Content-Type'  => 'text/html', 
      'Cache-Control' => 'public, max-age=86400' 
    },
    File.open('public/index.html', File::RDONLY)
  ]
}

问题:有没有办法映射多个 URL?例如foo.com/about 映射到 public/about/index.htmlfoo.com/posts/2012/oct/21/blog-post映射到 public/posts/2012/oct/21/blog-post/index.html

在这一点上,我什至可以手动打字。

感谢您的帮助。

【问题讨论】:

    标签: ruby static rack


    【解决方案1】:

    为什么需要run 语句?也许这对你有用:

    use Rack::Static, 
      :urls => ["/media/images", "/media/js", "/media/css"],
      :root => "public",
      :index => "index.html",
      :header_rules => [
        [:all, {'Cache-Control' => 'public, max-age=86400'}]
      ]
    
    run lambda{ |env| [ 404, { 'Content-Type'  => 'text/html' }, ['404 - page not found'] ] }
    

    【讨论】:

    • 显然你需要run。这是我使用上面的代码时得到的输出: /Library/Ruby/Gems/1.8/gems/rack-1.4.1/lib/rack/builder.rb:129:in `to_app': missing run or map statement ( RuntimeError) 来自 /[我的本地目录]/config.ru:1
    • 您的代码的问题在于,您使用 run 语句捕获了所有成功的请求。我没有想到您根本没有run 声明的情况。试试我编辑的答案。
    • 嗯。那似乎也不起作用。除了主页之外的每个页面都抛出了 404。顺便感谢您的帮助。
    • 我为您整理了一个示例项目,也许这会有所帮助:github.com/padde/rack-static-example
    • 如果您仍然遇到问题,请将您的日志输出附加到原始问题中。
    【解决方案2】:

    目前我发现最好的答案是:

    use Rack::Static, 
      :urls => ["/media/images", "/media/js", "/media/css"],
      :root => "public"
    
    map "/" do
      run lambda { |env|
      [
        200, 
        {
          'Content-Type'  => 'text/html', 
          'Cache-Control' => 'public, max-age=86400' 
        },
        File.open('public/index.html', File::RDONLY)
      ]
    }
    end
    
    map "/portfolio" do
      run lambda { |env|
      [
        200, 
        {
          'Content-Type'  => 'text/html', 
          'Cache-Control' => 'public, max-age=86400' 
        },
        File.open('public/portfolio/index.html', File::RDONLY)
      ]
    }
    end
    

    并将每个 URL 映射到其各自的文件。乏味,但有效。另请参阅this question regarding URL variables 的答案。但无法让它为我工作。

    【讨论】:

    • 在这种情况下,我建议你使用像sinatra 这样的包装器,它应该可以让你清理你的代码。
    猜你喜欢
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2017-12-09
    • 2015-10-28
    • 2011-10-22
    • 2016-09-21
    • 1970-01-01
    相关资源
    最近更新 更多