原因:
すでにIIS構成のスナップショットを示したように。これらは.Netアプリケーションで予約されているフォルダーとファイルであるため、IISはセキュリティのためにそれらを保持したいと考えています。
これらの文字列を含むURLは、これらが2つのスラッシュの前にあり、最後?
に2つのスラッシュの間にある場合にのみ、404応答として返されます。/../
例:www.example.com/bin/anything.extまたはwww.example.com/folder/sub/web.config
IISは、これらの文字列をどこでも一致させます。web.configは、任意のディレクトリレベルで実行できます。
それらの文字列に何かがある場合は、IISによってページが提供されます。例:www.example.com/bin-folder/anthing.extまたはwww.example.com/sub/bin.htmlまたはwww.example.com/-web.confing/page.aspxはOKです。
2つのスラッシュの間に挟まれないように、これらの文字列で他の単語を使用するか、拡張子の付いたURLの最後で使用することをお勧めします。
例:www.example.com/en-web.config/1
またはwww.example.com/en/1/web.config.aspx
それでも私は1つのトリッキーな解決策を持っています:
URLに他の単語が含まれていないこれらの文字列が本当に必要な場合は、をお勧めしuse URL-ReWrite.
ます。これは全体としては迅速ではないかもしれませんが、2番目のステップを除いて、その迅速で便利な2番目のステップはアプリケーションによって異なります。
1-このルールをIISのトップレベルに追加します。
正規表現の一致:(/ web | ^ web)\。(config $ | config /) //OR as your requirement
書き直し:handler.aspx?url = {REQUEST_URI}
<rule name="web-config" stopProcessing="true">
<match url="(/web|^web)\.(config$|config/)" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
<action type="Rewrite" url="handler.aspx?url={REQUEST_URI}" appendQueryString="false" />
</rule>
2-(handler.aspx
または他の言語ページで)url
GET変数を確認し、それに応じて応答します。Request.QueryString("url")
- ここでは、セキュリティを制御しているので注意してください。
handler.aspx or handler.php
リダイレクトなどではなく、実際のページコンテンツを応答に含めることをお勧めします。
- コンテンツを含める前に(正規表現などで)最初にURLを確認し、ハードコードされたコンテンツを含める前に、URLのどの部分も変数に取り込まず、その変数をresponse-inclusion-codeで使用してください。
3-その後、ついにIISマネージャーから、特定のWebサイトで、[フィルタリングの要求]-> [非表示セグメント]タブに移動し、目的の文字列を削除します。例:web.config。この手順は、web.configでも実行できます。
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="209715200" />
<hiddenSegments>
<remove segment="web.config" />
</hiddenSegments>
</requestFiltering>
</security>
これで、IISがページを提供し、ハンドラーページがユーザーブラウザーにまったく同じURLで出力を表示します。