IIS 7/7.5 で不要なHTTPレスポンスヘッダーを削除


IIS7以降の、不要なHTTPレスポンスヘッダーの削除方法のまとめ。内部的に設定されているレスポンスヘッダーの削除は、モジュールの作成・登録が必要。

モジュールの作成は簡単ですが、ユーザーへのトラフィック転送量と、該当モジュールの動作によるリソース消費・レスポンス遅延とのオーダーで、使うか・使わないかを決める事になりそう。時間があれば、トレースログでレスポンス遅延を計測してみたいところです。

GUI設定

IISマネージャーを使って設定できるのは、カスタムHTTPヘッダーのみです。IISのデフォルトだと次のヘッダーが、サーバーレベルで登録されています。

X-Powered-By:ASP.NET

「ASP.NET技術で提供されてますよ」程度の情報なので、トラフィック削減もかねて削除して問題ないかと。

 □参考:technet – IIS 7 で HTTP 応答ヘッダーを構成する

appcmd設定

前出のヘッダーをコマンドで消す場合には、次が使えます。

サーバーレベルで削除する例:

appcmd clear config /section:httpProtocol /customHeaders.[name='X-Powered-By',value='ASP.NET'] /commit:apphost

 □参考:technet – IIS 7 で HTTP 応答ヘッダーを構成する

モジュール作成・登録 (カスタムヘッダー以外の対応)


IIS7から、IIS各機能がモジュール構造となり、モジュールを追加することユーザー側で可能です。ServerやETagを削除する場合には、モジュールの作成が必要となります。カスタムモジュールに “”値 を入れるTIPSも見かけましたが、実験したところ上手く行きませんでした。

Server ヘッダー

IISのバージョンを返すヘッダー。バージョンをクライアントに通知しても、特にそれに対するアクションはないと思いますので、トラフィック削減と考えて削除して良いかと。

Server: Microsoft-IIS/7.0

ETagヘッダー

ETag(エンティティタグ)。IISでは、「Filetimestamp:ChangeNumber」というフォーマットで採番されます。しかし、IIS7からはChangeNumberが一律 “0″ になったため、IIS6の時のようなロードバランサー利用時の問題はなくなってると考えて良さそう。

ETag: “a35a34438623de1:0″

カスタムHTTPモジュール作成

IISの該当サイトのアプリケーションプールのマネージパイプラインモードが「統合」になってる必要があります。

MS物江さんのブログを参考に、Serverヘッダーの改変を、削除に変更してみました。設置手順は、物江さんのブログを参考にしてください。なお、ヘッダー改変ではない為、引数設定の為のWeb.configの修正は不要です(手順 4)。また、AlterHeaders は RemoveHeaders と変更して読み替えてください。

RemoveHeaders.cs (CSSの都合上 タブや改行が効かなく見づらくて、ごめんなさい)

using System;
using System.Web;
namespace MyIisExtentionModure
{
public class RemoveHeaders : IHttpModule
{
public void Dispose() {}
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += OnPreSendRequestHeaders;
}
void OnPreSendRequestHeaders(object sender, EventArgs e)
{
HttpContext.Current.Response.Headers.Remove(“Server”);
HttpContext.Current.Response.Headers.Remove(“ETag”);
}
}
}

AddModule

csをテキストエディタで修正すると、即座に反映されているのがおもしろい。こんなに簡単に実装できるとは驚きでした。一応w3wpワーカープロセスPIDを監視してましたが、csを修正しても再起動されてないですね。モジュールはw3wp外で動作しているのかな?

簡単にトレースログをとってみたところ、初回動作時は15ms程度RemoveHeadersの動作がかかってましたが、2回目以降は0msとなっていたので使えそうな予感です。

 □参考:
  ・msdn – IIS7 の機能を拡張してみる-レスポンスヘッダー内のサーバー名の改ざん
  ・Removing Unnecessary HTTP Headers in IIS and ASP.NET
  ・stackoverflow – Remove Server Response Header IIS7
  ・stackoverflow – How do I remove eTag headers from IIS7?
  ・IIS7 のトレース機能を使用して失敗した要求をトラブルシューティングする
  ・msdn – HttpApplication クラス

Comments are closed.