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)
  ]
}

ローカルでロードすると Web サイトは正常に見えますが、Heroku で実行すると、CSS ファイルのブラウザー コンソールに次のエラー メッセージが表示されます。

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

これらのエラーが発生する理由は何ですか?

サンプルサイト: http://salus8.heroku.com .

4

1 に答える 1

6

現在、アプリは 2 つの異なる方法でリクエストに応答しています。で始まるリクエスト/imagesは、フォルダーを検索して/public/images、リクエストに一致するファイルを返すことによって処理されます。その他のリクエストは、lambdaブロックを実行することで処理さindex.htmlれ、コンテンツ タイプが .xml のファイルが返されますtext/html

これは他のすべてのリクエストに適用されるため、ページが css ファイルを参照し、ブラウザーがそれを取得しようとすると、アプリはindex.htmlHTML コンテンツ タイプのページを返すため、MIME タイプに関する警告が表示されます。

これを修正する 1 つの方法は、ミドルウェアが処理/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 スタックを使用している場合は、Apache で「本物の」静的ホスティングを取得するために、php アプリを偽造することも検討できます。

ブラウザでファイルを直接開いているだけでない限り、これがローカルでは機能するのにHerokuでは機能しない理由はわかりません。サーバーをローカルで (たとえば でrackup) 実行していますか、それともファイルを直接見ていますか?

于 2012-06-15T16:39:57.377 に答える