連載
» 2015年05月08日 05時00分 UPDATE

Tech TIPS:WindowsのIISでURLにプラス記号を含むページが404エラーになるのを解消する

Windows ServerのIIS 7.0〜8.5で稼働しているWebサイトで、パス(URL)に「+」「%」などを含むページを開こうとすると404エラーが発生することがある。これはIISのデフォルトの設定が原因だ。設定を変更して解消するには?

[島田広道,デジタルアドバンテージ]
Tech TIPS
Windows Server Insider


「Tech TIPS」のインデックス

連載目次

対象ソフトウエア:IIS 7.0/IIS 7.5/IIS 8.0/IIS 8.5



解説

 Windows Server 2003のIIS 6.0あるいはApache Webサーバーといったプラットフォームから、Windows Server 2008〜2012 R2のIIS 7.0〜8.5にWebサイトを移設した場合、たとえ静的で単純なWebページであっても正しく表示されないことがある。

 例えば以下のように、クエリ文字列以外のパス(URL)に「+」「%」といった記号が含まれている場合が挙げられる

  • http://<ドメイン名>/default+ja.htm
  • http://<ドメイン名>/%25default.htm

 IIS 7.0〜8.5で稼働しているWebサイトでは通常、上記URLのページを開こうとすると、以下のように404エラーが返される。

半角のプラス記号(+)を含むURLで404エラーが発生した例 半角のプラス記号(+)を含むURLで404エラーが発生した例
これはIIS 8.5で稼働しているWebサイトに、別のPCからInternet Explorer(IE)でアクセスしたところ。HTTPのリターンコード404、すなわちファイル/フォルダーが見つからない、というエラーが返されている。
  (1)URLには「http://server1/default+ja.htm」と指定している。

 もっとも、404エラーが発生する原因はたくさんある。そこで、もっと詳細なエラー情報を得るために、対象のIISが稼働しているコンピューター上でIEを起動し、対象ページを開いてみたのが以下の画面である。

HTTPエラー404.11が返されている HTTPエラー404.11が返されている
これは対象のIISが稼働しているコンピューターで、IEから対象ページを開こうとしたところ。より詳細なエラーが表示されている(Webサイトの設定次第では、前述のリモートのPCの例と同程度の情報しか表示されないこともある)。
  (1)単なる404エラーではなく「404.11」というエラーコードが返されている。
  (2)エラーの原因として、「ダブルエスケープシーケンスが拒否されている」ことが挙げられている。

 このような症状の場合、IISがデフォルトで拒否する「ダブルエスケープシーケンス」がURLに使われているのが原因である。具体的には、クエリ文字列を除くURLに「+」「%25<16進数を表す文字列>」といったパターンが含まれていると、IISはそのURLを拒否し、HTTPエラー404.11を返す。

 デフォルトでこうした設定がなされているのは、エスケープ記号でURLに細工をすることでWebサーバーを攻撃する手法が存在するからだ。

 そのため、可能であれば「+」「%」を含まないURLに変更した方が安全だ。とはいえ、互換性などの都合からURLを変更できないこともあるだろう。その場合は、他の方法で攻撃を防止あるいは回避するようにしつつ、IISでダブルエスケープシーケンスを許可することになる。こうした前提の下で、本TIPSではその具体的な設定手順を説明する。

操作方法

●サーバー/サイト/フォルダーごとにダブルエスケープシーケンスを許可する

 IISのWebサーバー全体あるいはWebサイト、フォルダー単位でダブルエスケープシーケンスを許可するには、IISマネージャーの左ペインで対象のサーバー/サイト/フォルダーのいずれかを選択した後に、真ん中のペインから[要求フィルター]−[機能設定の編集]とクリックして、[ダブル エスケープを許可する]にチェックを入れてオンにする。

サーバー/サイト/フォルダーごとにダブルエスケープシーケンスを許可する(その1) サーバー/サイト/フォルダーごとにダブルエスケープシーケンスを許可する(その1)
これはWindows Server標準のIISマネージャーの画面。
  (1)対象のサーバーまたはサイト、フォルダーのいずれかを選択する。
  (2)真ん中のペインにある[要求フィルター]アイコンをダブルクリックして、要求フィルターの設定画面を開く。
サーバー/サイト/フォルダーごとにダブルエスケープシーケンスを許可する(その2) サーバー/サイト/フォルダーごとにダブルエスケープシーケンスを許可する(その2)
これは要求フィルターの設定画面。
  (3)右ペインの[機能設定の編集]をクリックすると、(4)を含むダイアログが表示される。
  (4)ダブル エスケープを許可する]にチェックをいれてオンにし、[OK]ボタンをクリックする。

 以上で作業は完了だ。設定変更は即座に反映されるので、試しに404.11エラーが生じていたページを再び読み込んでみよう。エラーの原因が要求フィルターだったなら、今度は正常な応答が得られるはずだ。

●特定のファイルだけにダブルエスケープシーケンスを許可する

 単独のファイルだけにダブルエスケープシーケンスを許可するには、IISマネージャーのコンテンツビューで対象ファイルを選択してから、機能ビューに戻って[要求フィルター]アイコンをダブルクリックし、前述の手順でダブルエスケープシーケンスの設定を変更する。

特定のファイルだけにダブルエスケープシーケンスを許可する 特定のファイルだけにダブルエスケープシーケンスを許可する
対象がファイルの場合、前述のサーバー/サイト/フォルダーの場合と比べて、若干手順が異なる。
  (1)対象ファイルが存在するフォルダーを選択する。
  (2)真ん中のペインで[コンテンツビュー]を選び、ファイル/フォルダー一覧を表示させる。
  (3)対象ファイルを選択する。
  (4)(3)のファイルを右クリックし、表示されたメニューから[機能ビューに切り替え]をクリックする。その後の手順は、前述のサーバー/サイト/フォルダーの場合と同じく、要求フィルターの設定を変更すればよい。

●コマンドラインでダブルエスケープシーケンスを許可する

 コマンドラインでダブルエスケープシーケンスの設定を変更することも可能だ。それにはIIS標準のappcmd.exeコマンドを利用する。例えば「Default Web Site」というWebサイト全体でダブルエスケープシーケンスを許可するには、次のコマンドラインを実行する。

%SystemRoot%\system32\inetsrv\appcmd.exe set config "Default Web Site" /section:requestfiltering /allowdoubleescaping:true



 サーバー全体やフォルダー(仮想ディレクトリ)単位でも設定可能だ。その場合のコマンドラインについては、次のページが参考になる。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。