IIS6とIIS7およびIIS7.5:クエリ文字列ではなく、プラス記号(+)がベースにあるURLの処理


38

(クエリ文字列ではなく)ベースURLにプラス記号(+)があるURLの場合、IIS7およびIIS7.5(Windows Server 2008および2008 R2)は、ASP.NETアプリケーションのデフォルトハンドラーにURLを転送するようには見えません。カスタムHTTPハンドラーでの問題に気づき始めまし*.htmlたが、で同じ問題があり*.aspxます。IIS6(Server 2003)には、これらの同じURLで問題はありません。

問題を再現するために、ASP.NETサイトで、さまざまな名前で簡単なResponse.Writeを実行するASPXファイルのセットを作成しました。

  1. test_something.aspx
  2. test_some + thing.aspx
  3. test_some thing.aspx

3番目のファイルは、IIS7 [.5]がプラス記号をスペースとして処理しているかどうかを確認するテストでした(クエリ文字列の場合と同様)。これは事実ではないようです。これらすべてのファイルを適切に配置すると、ASP.NETハンドラーに到達する前に、IIS6 ではヒットするhttp://somehost/test_some+thing.aspxhttp://somehost/test_some%2bthing.aspx、IIS7 / IIS7.5では404が正常に機能します。IIS 7 / 7.5には、HTTPハンドラーを決定するために使用される最終的な拡張子を失うことなく、URLのプラス記号を「見る」ために不足している構成がありますか?


プラス記号をエスケープするのが役立つのではないかと思います。たぶん\+
追って通知があるまで一時停止します。

回答:


39

IISとplusの組み合わせをさらに検索すると、IIS7 [.5]は、その文字の使用を恐れて、デフォルトでプラス記号付きのURLを拒否するように設定されているようです。ただし、その文字列はクエリ文字列で引き続き許可されます。解決策は、上のrequestFiltering属性のデフォルトを変更することで<system><webServer><security><requestFiltering>、コマンドラインコール(最終的にはあなたのASP.NET web.configファイルを変更する)と二重エンコードされた文字を許可します:

%windir%\system32\inetsrv\appcmd set config "Default Web Site" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true

これはWebサイトでの使用を好むよりも少し危険かもしれませんが、ブランケットが許可するよりも具体的な方法はないようです。警告は、URLでプラス記号を使用することと、スペースとしての一般的な翻訳との間で発生する可能性のある不一致に関するものでした。他の唯一の選択肢は、URLでプラス文字の使用を完全に停止することです。


2
参考までに、ルートレベルのテンプレートでこれを行う必要はありません。これは、任意のWeb.configファイルで実行するか、<location />タグを使用してサブフォルダーに適用できます。
mdonatas

IISマネージャー:サイト=> YourSite =>リクエストフィルター=>機能設定の編集... =>ダブルエスケープを許可する=> OK
diynevala

9

IIS7にURLのスペースにプラスをマッピングさせるように書き換えルールを作成する方法を見つけました。私の場合、レガシーブックマークまたはハイパーリンクを機能させ続けることでした。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering allowDoubleEscaping="True" />
    </security>
    <rewrite>
      <rules>
        <rule name="RewriteUserFriendlyURL1" stopProcessing="false">
          <match url="\+" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="{UrlDecode:{REQUEST_URI}}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

詳細とリファレンスについては、私のブログ投稿を参照してください。


1
上記のセキュリティセクションのみを使用して、クエリ文字列にプラス記号を含むレガシーURLをサポートする必要があるという問題を解決しました。つまり、allowDoubleEscapingを「True」に設定しました。
スティーブン

私にはユニークなケースがあります-いくつかのレガシーURLには2つの連続したプラス記号、つまり「++」があります。IISはこれに対して特別なルールを持っているようです。何か案は?
ブームハウアー

@boomhauerハンドラーを記述する必要があるかもしれません...または別のWebサーバーを使用してこれらのURLをホストしますか?以前、Apache mod_rewriteで多数のレガシーURLを処理し、それらをさまざまな新しい場所にリダイレクトするようにしたことがありますが、これはもう少し柔軟に思えました。
ネイサン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.