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に許可するにはどうすればよいですか?
問題は男子生徒の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]