web-dev-qa-db-ja.com

異なるディレクトリから静的ファイルを提供するようにApache + Passengerを設定します

Railsアプリを提供するようにApacheとPassengerをセットアップしようとしています。ただし、/ public以外のディレクトリから静的ファイルを提供し、これらの静的ファイルをRailsアプリのどのファイルよりも優先するためにも必要です。

Railsアプリは_/home/user/apps/testapp_にあり、静的ファイルは_/home/user/public_html_にあります。さまざまな理由から、静的ファイルをRailsパブリックフォルダーに単純に移動することはできません。また、ルート http://domain.com/ は、public_htmlフォルダー内のindex.htmlファイルによって提供される必要があることに注意してください。

これが私が使用している設定です:

_<VirtualHost *:80>

  ServerName  domain.com

  DocumentRoot /home/user/apps/testapp/public

  RewriteEngine On

  RewriteCond /home/user/public_html/%{REQUEST_FILENAME} -f
  RewriteCond /home/user/public_html/%{REQUEST_FILENAME} -d
  RewriteRule ^/(.*)$ /home/user/public_html/$1 [L]
</VirtualHost>
_

これはRailsアプリケーションに問題なく機能しますが、public_htmlからの静的コンテンツには404を提供します。 _DocumentRoot /home/user/public_html_を使用する構成も試しましたが、おそらく乗客がリクエストを処理することを知らないため、これはRailsアプリをまったく提供しません。

興味深いことに、条件を!-fと!-dに変更し、書き換えルールを別のドメインにリダイレクトすると、期待どおりに機能します(たとえば、_http://domain.com/doesnt_exist_は_http://otherdomain.com/doesnt_exist_にリダイレクトされます)

このような静的ファイルを提供するようにApacheを構成し、他のすべてのリクエストを引き続きPassengerに許可するにはどうすればよいですか?

1

問題は男子生徒のmod_rewriteエラーでした-RewriteRuleを実行するには、上記の両方のRewriteCondステートメントが満たされる必要がありますが、もちろん満たされることはありません。これは、これをネガティブコンディションテストからコピーし、それらを分離する必要があることに気づかなかった私のせいでした。 2つのRewriteRuleステートメントが必要なのは面倒ですが、これは完全に機能します。

  RewriteCond /home/user/public_html%{REQUEST_URI} -f
  RewriteRule ^ /home/user/public_html%{REQUEST_URI} [L]
  RewriteCond /home/user/public_html%{REQUEST_URI} -d
  RewriteRule ^ /home/user/public_html%{REQUEST_URI} [L]
1