WindowsのIISでURLにプラス記号を含むページが404エラーになるのを解消する:Tech TIPS
Windows ServerのIIS 7.0〜8.5で稼働しているWebサイトで、パス(URL)に「+」「%」などを含むページを開こうとすると404エラーが発生することがある。これはIISのデフォルトの設定が原因だ。設定を変更して解消するには?
対象ソフトウエア: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エラーが発生した例
これはIIS 8.5で稼働しているWebサイトに、別のPCからInternet Explorer(IE)でアクセスしたところ。HTTPのリターンコード404、すなわちファイル/フォルダーが見つからない、というエラーが返されている。
(1)URLには「http://server1/default+ja.htm」と指定している。
もっとも、404エラーが発生する原因はたくさんある。そこで、もっと詳細なエラー情報を得るために、対象のIISが稼働しているコンピューター上でIEを起動し、対象ページを開いてみたのが以下の画面である。
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)
これはWindows Server標準のIISマネージャーの画面。
(1)対象のサーバーまたはサイト、フォルダーのいずれかを選択する。
(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
サーバー全体やフォルダー(仮想ディレクトリ)単位でも設定可能だ。その場合のコマンドラインについては、次のページが参考になる。
- Appcmd.exe を使用して、サイト、アプリケーション、仮想ディレクトリ、または URL の設定を構成する (IIS 7)(マイクロソフト TechNet)
■関連リンク
- IIS 7.0 でホストされている Web サイトにアクセスすると、エラー メッセージ:「HTTP エラー 404.11-URL_DOUBLE_ESCAPED」[機械翻訳](マイクロソフト サポート技術情報)
- Appcmd.exe を使用して、サイト、アプリケーション、仮想ディレクトリ、または URL の設定を構成する (IIS 7)(マイクロソフト TechNet)
■この記事と関連性の高い別の記事
- クライアント版WindowsでIISをインストールする(TIPS)
- IIS 6.0をWindows XPから管理する(TIPS)
- IIS 6.0のWeb拡張機能を有効にする(TIPS)
- IIS 6.0をWindows Vistaから管理する(TIPS)
- IIS移行ツールiismt.exeでIISの設定/環境を移行させる(TIPS)
Copyright© Digital Advantage Corp. All Rights Reserved.