失敗した要求のトレースを使用して書き換えルールをトレースする

Ruslan Yakushev

IIS 7.0 以降の失敗した要求のトレース (FRT) は、要求処理エラーをトラブルシューティングするための強力なツールです。 FRT を URL Rewrite Module と共に使用すると、書き換えルールが要求 URL にどのように適用されたかをトレースできます。 このチュートリアルでは、FRT を使用して URL 書き換えルールのトラブルシューティングとデバッグを行う方法について説明します。 失敗した要求のトレースの詳細については、こちらの記事を参照してください。

前提条件

このチュートリアルでは、次の前提条件が必要です。

  1. ASP.NET および "トレース" 役割サービスが有効になっている IIS 7.0 以降
  2. URL Rewrite Go Live リリースがインストールされていること

テスト Web ページの設定

URL Rewrite Module がどのように機能するかを示すために、単純なテスト ASP.NET ページを使用します。 このページは、Web サーバー変数を読み取り、その値をブラウザーに出力します。

次の ASP.NET コードをコピーし、article.aspx という名前のファイルで %SystemDrive%\inetpub\wwwroot\ フォルダー内に配置します。

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>URL Rewrite Module Test</title>
</head>
<body>
      <h1>URL Rewrite Module Test Page</h1>
      <table>
            <tr>
                  <th>Server Variable</th>
                  <th>Value</th>
            </tr>
            <tr>
                  <td>Original URL: </td>
                  <td><%= Request.ServerVariables["HTTP_X_ORIGINAL_URL"] %></td>
            </tr>
            <tr>
                  <td>Final URL: </td>
                  <td><%= Request.ServerVariables["SCRIPT_NAME"] + "?" + Request.ServerVariables["QUERY_STRING"] %></td>
            </tr>
      </table>
</body>
</html>

このファイルをコピーしたら、http://localhost/article.aspx にアクセスし、ページがブラウザーで正しくレンダリングされたことを確認します。

Web ブラウザーを使用して記事ページにアクセスするスクリーンショット。

書き換えルールの構成

web.config ファイルを、%SystemDrive%\inetpub\wwwroot\ フォルダー内で見つけるか、存在しない場合は作成します。 web.config ファイルを開き、<system.webServer> 要素内に次のセクションを追加します。

<rewrite>
      <rules>
        <rule name="Fail bad requests">
          <match url="." />
          <conditions>
            <add input="{HTTP_HOST}" negate="true" pattern="localhost" />
          </conditions>
          <action type="AbortRequest" />
        </rule>
        <rule name="Rewrite to article.aspx">
          <match url="^article/([0-9]+)/([_0-9a-z-]+)" />
          <action type="Rewrite" url="article.aspx?id={R:1}&amp;title={R:2}" />
        </rule>
      </rules>
</rewrite>
  • "Fail bad requests" ルールは、HTTP 要求のホスト ヘッダーが "localhost" と一致しない場合に HTTP 接続を中止します
  • "Rewrite to article.aspx" ルールは、URL を http://localhost/article/234/some-title 形式から http://localhost/article.aspx?id=234&title=some-title 形式に書き換えます。

ブラウザーを開いて http://localhost/article/234/some-title に要求を行い、ルールが正しく構成されていることを確認します。 ルールが正しく設定されている場合は、ブラウザーに次の応答が表示されます。

元の U R L と書き換えられたバージョンを表示する [U R L の書き換えモジュール テスト] ページのスクリーンショット。

失敗した要求のトレースを構成する

次に、"既定の Web サイト" の失敗した要求のトレースを有効にします (FRT を有効にする手順については、こちらの記事を参照してください)。 失敗した要求のトレースを有効にしたら、URL Rewrite Module に固有のイベントをトレースするための FRT ルールを作成します。

IIS マネージャーで FRT ルールを作成するには、次の手順に従います。

  1. [失敗した要求のトレース ルール] アイコンをクリックして、FRT ルールの一覧にアクセスします。
    [失敗した要求トレース ルール] が選択されている [既定の Web サイト ホーム] ウィンドウのスクリーンショット。
  2. [追加] アクションをクリックして、FRT ルール作成ウィザードを起動します。[すべてのコンテンツ ] (アスタリスク) が選択されている [失敗した要求トレース ルールの追加] ダイアログのスクリーンショット。
  3. ウィザードの最初のページで、[すべてのコンテンツ (*)] を選びます
  4. [次へ] をクリックし、[状態コード] に "200-399" を指定します
    状態コードを 200 ダッシュ 399 の値に設定するスクリーンショット。
  5. [次へ] をクリックし、[WWW Server] を除くすべてのトレース プロバイダーのチェックを外し、[書き換え] を除くすべてのプロバイダー領域のチェックを外しますプロバイダーを W W W サーバーのみに設定し、領域を書き換えのみに設定するスクリーンショット。
  6. [完了] をクリックして FRT ルールを保存します。

URL Rewrite Module の後に失敗した要求のトレースがインストールされている場合は、トレース プロバイダーの [書き換え] 領域が使用できない可能性があります。 [書き換え] 領域が表示されない場合は、[プログラムの追加と削除] に移動し、修復モードで URL Rewrite Module インストーラーを実行します。

失敗した要求のトレース ログ ファイルの分析

FRT ルールが作成されたら、http://localhost/article/234/some-title に要求を行います。 これにより、%SystemDrive%\inetpub\Logs\FailedReqLogFiles\ に FRT ログが作成されます。 このログは Internet Explorer を使用して開くことができ、簡単に参照できる HTML ドキュメントとしてレンダリングされます。 トレース ログ ファイルにある URL Rewrite 固有のイベントの例を次に示します。

Web ブラウザーを使用して F R T ログにアクセスするスクリーンショット。ログには、書き換えルールとその書き換えロジックの一覧が表示されます。

これらのイベントは、書き換えルールがどのように評価されたか、および要求された URL が書き換えモジュールによってどのように変更されたかを示します。 ルール評価ロジックをより深く理解するために、いくつかのイベントを見てみましょう。

URL_REWRITE_START - このイベントは、URL 書き換えイベントの開始を示します。 このイベント プロパティでは、次の情報が提供されます。

  • 入力 URL 文字列は "/article/234/some-title" である。
  • クエリ文字列はなかった。
  • Scope="Distributed" は、ルールがグローバル (つまり、ルールがサーバー レベルで定義される) ではなく、ローカル (つまり、サイトの Web.config で定義される) であることを示している

RULE_EVALUATION_START - このイベントは、ルール評価ロジックの開始を示します。 このイベント プロパティでは、次の情報が提供されます。

  • ルールはパターン構文に正規表現を使用している (patternSyntax="ECMAScript")
  • 後続のルールが評価される (StopProcessing = "false")
  • このルールはサイト ルート レベルで定義される (RelativePath = "/")

PATTERN_MATCH - このイベントは、URL がルール パターンとどのように一致したかに関する情報を提供します。 このイベント プロパティでは、次の情報が提供されます。

  • ルール パターンは "." であった (つまり、任意の文字に一致する)
  • 入力 URL がパターンに合致した

CONDITIONS_EVALUATION_START - 入力 URL がパターンと一致したため、条件の評価が開始されました

CONDITION_EVALUATION - このイベントでは、次の情報が提供されます。

  • HTTP_HOSTの値は "localhost" で、パターンと一致した
  • 条件否定がルールで指定されていたため (つまり、Negated="true")、条件の評価が成功しなかった。

CONDITIONS_EVALUATION_END - このイベントは、このルールの条件の評価が成功しなかったことを示します

RULE_EVALUATION_END - このイベントは、ルールによって URL が変更されなかったことを示します (Succeeded="false")。 これは、ルール条件の評価に失敗したためです。

RULE_EVALUATION_START - このイベントは、URL 文字列が 2 番目のルールに渡されたことを示します

PATTERN_MATCH - このイベントは、URL がルール パターンとどのように一致したかに関する情報を提供します。 このイベント プロパティにより、次のことがわかります。

  • ルール パターンが "^article/([0-9]+)/([0-9a-z]+)" であった
  • 入力 URL がパターンに合致した

REWRITE_ACTION - このイベントは、ルールの評価が成功し、URL がクエリ文字列 "id=234>title=some-title" で "/article.aspx" に書き換えられたことを示します

まとめ

FRT によってログに記録される URL 書き換え固有のイベントにより、非常に詳細な情報が提供されます。これは、URL 書き換えルールのトラブルシューティングとデバッグに使用できるだけでなく、ルール評価ロジックが URL 文字列にどのように適用されるかを理解するためにも使用できます。