サーバーに空のプロジェクトを設置したらRailsの環境情報が表示されない。どうして?
という質問がありました。具体的には、public/index.html の "About your application’s environment" というリンクをクリックしたら表示される部分のことです。
おなじみのこれですね。
エラーログを見たらわかりそうなものですが、私はサーバに入れず、エラーログには何も出力されていない、ということなので、よくわかりませんでした。
なので、ローカルでためしてみました。
$ ./script/server -e production
としてプロダクション環境で起動してみたところ、
確かに表示されません。ログも見たところ、
ActionController::RoutingError (No route matches "/rails/info/properties" with {:method=>:get}): Rendering rescues/layout (not_found)
となっていましたので、ははーん、Railsがプロダクション環境では表示されないように潰しているな。と当たりを付けました。
なんでこういうことになっているかというと、悪い人が環境情報を読んでバージョンに合わせた脆弱性を突く、といったことがないようにだと思います。
質問者の場合は、そのサーバは開発環境だということでしたので、Passenger(on Apache)の設定ファイルに、
RailsEnv development
と追加してもらい事なきを得ました。
これで終わりでもよかったのですが、ん?待てよ?JRuby on Rails on GAEの実証ページでは表示されてたよな?と疑問に思いましたので、view sourceをクリックしてソースを拝見させていただいたところ、app/controllers/rails/info_controller.rbが独自に追加されていました。
なるほど、ファイルを置けば動くんだな、と至極当たり前のことに気づきましたのでやってみました。
Railsのgemを"Rails::InfoController" という文字列でgrepしたところ、RUBY_LIB/gems/1.8/gems/rails-2.3.5/builtin/rails_info/rails/info_controller.rb 周辺が目的の動作をしているようなのでコピーして、
$ cp /opt/local/lib/ruby/gems/1.8/gems/rails-2.3.5/builtin/rails_info/rails app/controllers/
ついでに、info_controller.rb の中を見てみるとローカルリクエスト以外は弾く設定になっているようなので、ちょっと以下のように改変しました:
class Rails::InfoController < ActionController::Base def properties render :inline => Rails::Info.to_html =begin if consider_all_requests_local || local_request? render :inline => Rails::Info.to_html else render :text => '<p>For security purposes, this information is only available to local requests.</p>', :status => 500 end =end end end
というわけで無事にプロダクション環境でも表示出来ました。パチパチ。
とはいっても、サーバの状態を知られると不利になりますので、ご利用はお控え下さい。
※ twitter で無償 Rails サポートボランティアをやっています。"Rails" という単語で監視していますので、つぶやくと、解決方法を知っている場合は reply 致します。24時間監視はできませんので、なんらかの返事が欲しい場合は、直接 @babie までメッセージを下さい。また、動作確認・保証は行いませんのでご了承ください。