4

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 上运行它时,我在浏览器控制台中收到以下 CSS 文件的错误消息:

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

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

示例站点:http ://salus8.heroku.com 。

4

1 回答 1

6

您的应用当前以两种不同的方式响应请求。/images通过搜索/public/images文件夹并返回与请求匹配的任何文件来处理以 开头的请求。任何其他请求都通过运行该lambda块来处理,该块返回index.html内容类型为text/html.

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

解决此问题的一种方法是将中间件处理/css的 url 添加到列表中:Static

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

并将您的 css 文件放在public/css目录中(正如我所写,看起来您已经这样做了)。

这将解决您的直接问题,但您可能会遇到问题,例如,如果您想在顶层目录中拥有多个 HTML 页面。

另一种实现静态站点的解决方案可以index.html为任何没有路径的请求提供服务,这就是您在这里尝试做的事情,可能是使用rack-rewritegem 和Rack::File应用程序。添加gem 'rack-rewrite'到您的 Gemfile,然后使用config.ru这样的:

require 'rack/rewrite'

use Rack::Rewrite do
  rewrite "/", "/index.html"
end

run Rack::File.new("public")

这将使用匹配文件(如果存在)响应 所有请求,并且任何没有路径到达的请求都将获得index.html. (请注意,它不适用于index.html对主目录下的子目录的请求)。

如果您使用 Heroku 的 Cedar 堆栈,您还可以考虑伪造一个 php 应用程序,以便使用 Apache 获得“真正的”静态托管

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

于 2012-06-15T16:39:57.377 回答