サーバーに空のプロジェクトを設置したら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 までメッセージを下さい。また、動作確認・保証は行いませんのでご了承ください。