在heroku中的静态网站中加载css文件

时间:2012-06-14 21:11:55

标签: ruby heroku rack

我的config.ru如下:

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

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

当我在本地加载它时,网站看起来很好,但是当我在Heroku上运行它时,我在浏览器控制台中收到以下错误消息:

Resource interpreted as Stylesheet but transferred with MIME type text/html.

知道我为什么会收到这些错误吗?

示例网站:http://salus8.heroku.com

1 个答案:

答案 0 :(得分:6)

您的应用目前以两种不同的方式响应请求。以/images开头的请求通过搜索/public/images文件夹并返回与请求匹配的任何文件来提供。运行lambda块可以提供任何其他请求,该块会返回内容类型为index.html的{​​{1}}文件。

这适用于任何其他请求,因此当您的页面引用css文件并且浏览器尝试获取它时,您的应用将返回包含HTML内容类型的text/html页面,因此有关MIME类型的警告。

解决此问题的一种方法是将index.html添加到/css中间件处理的网址列表中:

Static

并将您的css文件放在use Rack::Static, :urls => ["/images", "/css"], :root => "public" 目录中(正如我所写,看起来您已经这样做了。)

这可以解决您当前的问题,但如果您希望在顶层目录中有多个HTML页面,则可能会出现问题。

实现静态网站的另一个解决方案是为public/css提供任何没有路径的请求,这就是你在这里尝试做的事情,可能是使用rack-rewrite gem和一个index.html申请。将Rack::File添加到您的Gemfile中,然后使用gem 'rack-rewrite',如下所示:

config.ru

这将使用匹配的文件(如果存在)响应所有请求,并且任何没有路径的请求都将获得require 'rack/rewrite' use Rack::Rewrite do rewrite "/", "/index.html" end run Rack::File.new("public") 。 (请注意,它不会为主目录下的子目录请求提供index.html

如果您正在使用Heroku的Cedar堆栈,您还可以查看faking a php app in order to get “real” static hosting with Apache

我不知道为什么这会在本地工作但不能在Heroku上工作,除非你只是直接在浏览器中打开文件。您是在本地运行服务器(例如使用index.html),还是直接查看文件?