mongrelでResponse HeaderのServerヘッダを隠す方法[mongrel][rails][ruby]
斜め読みしかしてないがmongrel-1.1.3のソース
./ext/http11/http11.cで
387 DEF_GLOBAL(mongrel_version, "Mongrel 1.1.3"); /* XXX Why is this defined here? */ 388 DEF_GLOBAL(server_software, "SERVER_SOFTWARE"); //でmongrelのバージョンなんかが定義されてて 151 void header_done(void *data, const char *at, size_t length . . //ここでセットされてるっぽい 186 rb_hash_aset(req, global_server_protocol, global_server_protocol_value); 187 rb_hash_aset(req, global_server_software, global_mongrel_version); 188 }
/ext/http11/http11_parser.c
の
341 if(parser->header_done != NULL) 342 parser->header_done(parser->data, p + 1, pe - p - 1); //でheader_done関数は呼ばれている
どうもmongrelの立ち上げ段階でセットされてしまって
る
ruby側みてみると
./lib/mongrel/cgi.rb #ここでServerヘッダー出力を制御できそう!! 73 @head['Server'] = options['server'] || env_table['SERVER_SOFTWARE'] #さらに追ってみると 127 def out(options = "text/html", really_final=@default_really_final) 128 if @out_called || !really_final 129 # don't do it more than once or if it's not the really final call 130 return 131 end 132 #ここで呼ばれている 133 header(options) 134 135 @response.start status do |head, body| 136 send_cookies(head) 137 138 @head.each {|k,v| head[k] = v} 139 body.write(yield || "") 140 end 141 142 @out_called = true 143 end
#ハードコーディングされてる 81 cgi.out("text/html",true) {""}
optionがハードコードされてる+optionの方が
優先されてる(||より前)なので
どうやら本当にmongrelに手を加えるしかなさそう
結局これをつかって
http://www.pinkdragon.net/doc_lib/contents/ja/apache_2_2_man/mod/mod_headers.html
Header unset Serverでmongrel側から送信されるServerヘッダを削除
<Proxy balancer://mongrel_rails_cluster/> Header unset Server