web-dev-qa-db-ja.com

URLの末尾のドットは、IIS

IIS8にASP.NETサイトがありますが、IIS7.5はまったく同じように動作します。次のようなURLを入力すると:

mysite.com/foo/bar..

「500InternalServerError」ステータスコードで次のエラーが発生します。

enter image description here

カスタムエラーページを500と404に設定していて、カスタムエラーページに問題はありません。

私のweb.configsystem.webノードには、次のものがあります。

<customErrors mode="On">
  <error statusCode="404" redirect="/404.aspx" />
</customErrors>

そのセクションを削除すると、404.0の応答が返されますが、ページ自体は空白です。

Web.config system.webServerには、次のものがあります。

<httpErrors errorMode="DetailedLocalOnly">
  <remove statusCode="404" subStatusCode="-1" />
  <error statusCode="404" prefixLanguageFilePath="" path="404.html" responseMode="File" />
</httpErrors>

しかし、それが存在するかどうかに関係なく、予想されるカスタムエラーページではなく、同じ空白の404.0ページが表示されるか、少なくとも内部IISメッセージが表示されます。

したがって、まず最初に、asp.netハンドラーが「..」の要求を取得するのはなぜですか(1つ以上の末尾のドットでも機能します)

ApplicacationHost.configから次のハンドラーを削除した場合:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" responseBufferLimit="0" />

期待どおりのカスタム404ページが表示されますが、もちろんそのハンドラーを削除すると、特にasp.netでのルーティングが中断されます。

私が見る失敗の痕跡を見る:

enter image description here

サイトでWindows認証が無効になっているのに、なぜそのモジュールが要求パイプラインにあるのですか?

今のところ私の修正は、次のルールでURL書き換えモジュールを使用することです。

<rewrite>
    <rules>
        <rule name="Trailing Dots" stopProcessing="true">
            <match url="\.+$" />
            <action type="Rewrite" url="/404.html" appendQueryString="false" />
        </rule>
    </rules>
</rewrite> 

これは問題なく機能しますが、IIS/ASP.NETがこのように動作するのはなぜですか?

4
Peter Hahndorf

これに関するKBがあります: http://support.Microsoft.com/kb/2520479

その結果、さまざまな関数の.NETハンドラーが混同され、誤った方向に向けられる操作の順序の問題が発生します。一部の.NETハンドラーは、URLを拡張子のない形式に書き直し、他のことを狂わせる可能性があります。

簡単な回避策の修正は、PathInfoデータに影響を与える可能性のあるカスタムハンドラーを追加した後、すべての「ExtensionlessUrlHandler」ハンドラーをリストの最後に移動することです。

正確なエラーではないかもしれませんが、試す価値は十分にあります。また、ハンドラーの順序は、ApplicationHost.Configおよび関連する構成ファイルのADDの順序によって構成されていることを覚えておく価値があります。

3
Mark

この属性をhttpRuntimeセクションに追加すると、次のことが役立つ場合があります。

<configuration>
  <system.web>
    <httpRuntime ... relaxedUrlToFileSystemMapping="true" .../>
  </system.web>
</configuration>

HTTPリクエストのURLが有効なWindowsファイルパスである必要があるかどうかを示す値を取得または設定します。

relaxedUrlToFileSystemMapping に関する詳細情報

3
Bagherani

Dotnetフレームワークがこの厄介な動作を示す理由についてはお答えできません。 404を処理された404として扱い、デフォルトのIIS 404ページをスキップするかのようです。おそらく次のように設定されます。

Response.IisTrySkipIisCustomErrors

Microsoftドキュメント

とにかく、私があなたのルールを実装したとき、私はあなたの正規表現を微調整して、末尾の.とそれに続くオプションの/をサポートしました。

例えば.

https://localhost/investing./

オプションのスラッシュをサポートするように更新しました。

<rule name="Trailing Dots" stopProcessing="true">
    <match url="\.+/?$" />
    <action type="Rewrite" url="/404.html" appendQueryString="false" />
  </rule>

コメントとしてこれを追加したと思いますが、これを行うランクがありません。

1
andyvan