0

ディレクトリから静的アセットを提供する Rails アプリに Sinatra アプリがあります。アプリは、次のように Rails ルートにマウントされます。

mount BeanstalkdView::Server, :at => "/beanstalk"

これをローカルで実行すると、Thin を使用して正常に動作しますが、テスト サーバー (Nginx/Passenger) で実行すると、静的アセットの動作がおかしくなりました。静的ファイルへのリクエストは 200 OK を返しますが、コンテンツはありません。

Sinatra に静的ファイルの場所を伝えset :public_folder, "#{root}/resources"、テンプレートで静的ファイルを読み込みます#{request.env['SCRIPT_NAME']}/css/file.css。両方のパスが正しいことを確認しました。

4

2 に答える 2

3

これは、実稼働環境の Rails 3.0.x でデフォルトで有効になっているミドルウェアが原因で発生し::Rack::Sendfileます (3.1.x 以降の環境ではデフォルトで無効になっています)。

このミドルウェアは非常にシンプルですが、強力です。::Rack::Fileに応答するor ::Sinatra::StaticFile(またはその他のオブジェクト) を渡すと:path、このミドルウェアはX-SendFile(Apache の場合) またはX-SendFile-Redirect(NGinx の場合) を追加し、実際の本文は送信しません。Apache または NGinx が実際のファイル配信を処理するようにします。これは、本番環境で静的アセットを提供するための優れた最も効率的な方法ですが、このミドルウェアを無効にすることもできます (Nginx/Apache 構成をいじりたくない場合)。config/environments/production.rbファイルで次の構成オプションを見つけてコメントします。

config.action_dispatch.x_sendfile_header

この構成オプションは、設定Sendfileするヘッダーをミドルウェアに指示するために使用されます (指定されていない場合は何もしません)。

于 2013-04-30T15:04:12.003 に答える
2

アレクセイVの答えは私を大いに助けてくれました。最後に、Nginxの適切な設定を使用してこれを修正しましたproduction.rb

config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'

Rails アプリ Nginx を再起動し、ブラウザでハード リフレッシュを行ってファイルを取得してください。

詳細については、http: //jimneath.org/2011/04/05/rails-3-nginx-and-send_file.htmlをご覧ください。

于 2013-05-01T11:59:29.663 に答える