水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > URLに%22が含まれると例外が出る問題

URLに%22が含まれると例外が出る問題

2010年7月25日(日曜日)

URLに%22が含まれると例外が出る問題

公開: 2010年7月25日21時30分頃

IIS6でワイルドカードアプリケーションマップ使用時に、パス文字列に%22が含まれると例外が出るという問題があります。

IIS6には「ワイルドカードアプリケーションマップ」という機能があり、これを使うと、Webサーバへのアクセスを全て特定のプログラムで処理することができます。詳しくは「ワイルドカード アプリケーション マッピングをインストールする (technet.microsoft.com)」に書かれていますが、設定はとても簡単です。

bakera.jpではこの機能を使っていて、http://bakera.jp/ 以下へのリクエスト全てをASP.NETで処理するようにしています。拡張子.htmlに見えるリソースも、実はすべてASP.NETが処理しています。

この方法だと、あらゆるリクエストを特定のアプリケーションで処理できる……はずなのですが、実は問題があって、URLのクエリよりも前の部分に%22が含まれていると謎の例外が発生してしまいます。

[ArgumentException: パスに無効な文字が含まれています。]

System.IO.Path.CheckInvalidPathChars(String path) +7491109

System.IO.Path.GetExtension(String path) +19

System.ServiceModel.Activation.HttpModule.ProcessRequest(Object sender, EventArgs e) +218

System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +68

System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

スタックトレースを見ると分かりますが、アプリケーションに処理が渡る前のところで例外が発生していますので、アプリケーション側ではどうしようもありません。おそらく、内部的に一度パスに対応するファイルを探していて、パス名として無効な文字が含まれていると死ぬのでしょう。ワイルドカードマッピングなのですから、ファイルを探す必要はないはずなのですが。

これ、昔から分かってはいたのですが、そもそもbakera.jp内でURL内に%22を使ったりはしていませんし、そんなリクエストもないので特に気にしていなかったのでした。が、最近、何故かURLの末尾に余計なゴミの%22をつけてくるリクエストが来るようで、イベントログに毎日例外の記録が残るようになりました。

仕方ないので対応を検討することに。とりあえず、web.configに以下のような記述を追加して……。

<customErrors defaultRedirect="/error"/>

こうしておくと、エラー時に /error?aspxerrorpath=(エラーが起きたパス) にリダイレクトされるようになります。クエリの後ろになら %22 があっても大丈夫なので、このURLはエラーになりません。そして、/error 側で %22 を除去してもう一度リダイレクトすると。

しかし、なんだか非常にまだるっこしいですね。他にもっとスマートな解決法はないものでしょうか。

※2010-07-31追記: HttpModuleを使う方法でスマートに解決しました……URLに%22が含まれても何とかする方法

関連する話題: C# / .NET / ASP.NET / IIS / hatomaru.dll

最近の日記

関わった本など