我的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。
答案 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
),还是直接查看文件?