Application Gateway で HTTP ヘッダーを書き換えるRewrite HTTP headers with Application Gateway

注意

この記事は、新しい Azure PowerShell Az モジュールを使用するために更新されました。This article has been updated to use the new Azure PowerShell Az module. AzureRM モジュールはまだ使用でき、少なくとも 2020 年 12 月までは引き続きバグ修正が行われます。You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Az モジュールと AzureRM の互換性の詳細については、「Introducing the new Azure PowerShell Az module (新しい Azure PowerShell Az モジュールの概要)」を参照してください。To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Az モジュールのインストール手順については、Azure PowerShell のインストールを参照してください。For Az module installation instructions, see Install Azure PowerShell.

クライアントとサーバーは、HTTP ヘッダーを使用して、要求または応答に追加の情報を渡すことができます。HTTP headers allow a client and server to pass additional information with a request or response. これらのヘッダーの書き換えによって、HSTS/X-XSS-Protection などのセキュリティ関連ヘッダー フィールドの追加、機密情報が漏れる可能性のある応答ヘッダー フィールドの削除、X-Forwarded-For ヘッダーからのポート情報の削除など、重要なタスクを実現できます。By rewriting these headers, you can accomplish important tasks, such as adding security-related header fields like HSTS/ X-XSS-Protection, removing response header fields that might reveal sensitive information, and removing port information from X-Forwarded-For headers.

Application Gateway を使用することで、要求/応答パケットがクライアントとバックエンド プールの間を移動する間に、HTTP 要求および応答ヘッダーを追加、削除、または更新することができます。Application Gateway allows you to add, remove, or update HTTP request and response headers while the request and response packets move between the client and back-end pools. また、条件を追加することで、特定の条件が満たされた場合にのみ、指定したヘッダーが確実に書き換えられるようにできます。And it allows you to add conditions to ensure that the specified headers are rewritten only when certain conditions are met.

Application Gateway は、要求と応答に関する追加情報を格納するための複数のサーバー変数もサポートしています。Application Gateway also supports several server variables that help you store additional information about requests and responses. このため、簡単に強力な書き換え規則を作成できます。This makes it easier for you to create powerful rewrite rules.

注意

HTTP ヘッダーの書き換えは、Standard_V2 and WAF_v2 SKU でのみサポートされます。The HTTP header rewrite support is only available for the Standard_V2 and WAF_v2 SKU.

ヘッダーを書き換える

サポートされているヘッダーSupported headers

要求と応答では、ホスト、接続、およびアップグレードのヘッダーを除くすべてのヘッダーを書き換えることができます。You can rewrite all headers in requests and responses, except for the Host, Connection, and Upgrade headers. また、アプリケーション ゲートウェイを使用してカスタム ヘッダーを作成し、ゲートウェイを経由してルーティングされる要求と応答にヘッダーを追加することもできます。You can also use the application gateway to create custom headers and add them to the requests and responses being routed through it.

書き換え条件Rewrite conditions

書き換え条件を使用して、HTTP(S) の要求と応答のコンテンツを評価し、1 つ以上の条件が満たされたときにのみヘッダーの書き換えを実行することができます。You can use rewrite conditions to evaluate the content of HTTP(S) requests and responses and perform a header rewrite only when one or more conditions are met. アプリケーション ゲートウェイは、次の 3 種類の変数を使用して、HTTP(S) の要求と応答のコンテンツを評価します。The application gateway uses these types of variables to evaluate the content of HTTP(S) requests and responses:

  • 要求の HTTP ヘッダー。HTTP headers in the request.
  • 応答の HTTP ヘッダー。HTTP headers in the response.
  • Application Gateway のサーバー変数。Application Gateway server variables.

条件を使用して、指定した変数が存在するかどうか、指定した変数が特定の値と一致するかどうか、または指定した変数が特定のパターンと一致するかどうかを、評価することができます。You can use a condition to evaluate whether a specified variable is present, whether a specified variable matches a specific value, or whether a specified variable matches a specific pattern. 条件に正規表現のパターン マッチングを設定するには、Perl Compatible Regular Expressions (PCRE) ライブラリを使用します。You use the Perl Compatible Regular Expressions (PCRE) library to set up regular expression pattern matching in the conditions. 正規表現の構文については、Perl 正規表現の man ページをご覧ください。To learn about regular expression syntax, see the Perl regular expressions main page.

書き換えアクションRewrite actions

書き換えアクションを使用して、書き換える要求および応答ヘッダーと、ヘッダーの新しい値を指定します。You use rewrite actions to specify the request and response headers that you want to rewrite and the new value for the headers. 新しいヘッダーを作成すること、既存のヘッダーの値を変更すること、または既存のヘッダーを削除することができます。You can either create a new header, modify the value of an existing header, or delete an existing header. 新しいヘッダーまたは既存のヘッダーの値は、次の種類値に設定できます。The value of a new header or an existing header can be set to these types of values:

  • テキスト。Text.
  • 要求ヘッダー。Request header. 要求ヘッダーを指定するには、{http_req_<ヘッダー名>} という構文を使用する必要があります。To specify a request header, you need to use the syntax {http_req_headerName}.
  • 応答ヘッダー。Response header. 応答ヘッダーを指定するには、{http_resp_<ヘッダー名>} という構文を使用する必要があります。To specify a response header, you need to use the syntax {http_resp_headerName}.
  • サーバー変数。Server variable. サーバー変数を指定するには、{var_<サーバー変数>} という構文を使用する必要があります。To specify a server variable, you need to use the syntax {var_serverVariable}.
  • テキスト、要求ヘッダー、応答ヘッダー、サーバー変数の組み合わせ。A combination of text, a request header, a response header, and a server variable.

サーバー変数Server variables

Application Gateway では、サーバー変数を使用して、サーバー、クライアントとの接続、およびその接続での現在の要求に関する情報が格納されます。Application Gateway uses server variables to store useful information about the server, the connection with the client, and the current request on the connection. 格納される情報には、クライアントの IP アドレスや Web ブラウザーの種類などがあります。Examples of information stored include the client’s IP address and the web browser type. サーバー変数は、たとえば新しいページが読み込まるときや、フォームが投稿されるときに動的に変化します。Server variables change dynamically, for example, when a new page loads or when a form is posted. これらの変数を使用して、書き換え条件を評価し、ヘッダーを書き換えることができます。You can use these variables to evaluate rewrite conditions and rewrite headers. サーバー変数の値を使用してヘッダーを書き換えるには、{var_serverVariable} という構文でこれらの変数を指定する必要がありますIn order to use the value of server variables to rewrite headers, you will need to specify these variables in the syntax {var_serverVariable}

アプリケーション ゲートウェイでは、次のサーバー変数がサポートされています。Application gateway supports these server variables:

変数名Variable name 説明Description
add_x_forwarded_for_proxyadd_x_forwarded_for_proxy X-Forwarded-For クライアント要求ヘッダー フィールドと、IP1、IP2、IP3 などの形式でそれに追加される client_ip 変数 (この表で後ほど説明します) が含まれています。The X-Forwarded-For client request header field with the client_ip variable (see explanation later in this table) appended to it in the format IP1, IP2, IP3, and so on. X-Forwarded-For フィールドがクライアント要求ヘッダーにない場合、add_x_forwarded_for_proxy 変数は $client_ip 変数と等しくなります。If the X-Forwarded-For field isn't in the client request header, the add_x_forwarded_for_proxy variable is equal to the $client_ip variable. この変数は、Application Gateway によって設定された X-Forwarded-For ヘッダーを書き換えるときに特に有用です。この方法により、ヘッダーにはポート情報は含まれず、IP アドレスのみが含まれるようになります。This variable is particularly useful when you want to rewrite the X-Forwarded-For header set by Application Gateway so that the header contains only the IP address without the port information.
ciphers_supportedciphers_supported クライアントでサポートされている暗号の一覧。A list of the ciphers supported by the client.
ciphers_usedciphers_used 確立された TLS 接続で使用される暗号の文字列。The string of ciphers used for an established TLS connection.
client_ipclient_ip アプリケーション ゲートウェイが要求を受信したクライアントの IP アドレス。The IP address of the client from which the application gateway received the request. アプリケーション ゲートウェイと元のクライアントの前にリバース プロキシがある場合、client_ip ではリバース プロキシの IP アドレスが返されます。If there's a reverse proxy before the application gateway and the originating client, client_ip will return the IP address of the reverse proxy.
client_portclient_port クライアント ポート。The client port.
client_tcp_rttclient_tcp_rtt クライアント TCP 接続の情報。Information about the client TCP connection. TCP_INFO ソケット オプションをサポートするシステムで使用できます。Available on systems that support the TCP_INFO socket option.
client_userclient_user HTTP 認証の使用時に、認証のために提供されるユーザー名。When HTTP authentication is used, the user name supplied for authentication.
hosthost 優先順位は次の通りです: 要求行のホスト名、Host 要求ヘッダー フィールドのホスト名、要求に一致するサーバー名。In this order of precedence: the host name from the request line, the host name from the Host request header field, or the server name matching a request. 例: 要求 http://contoso.com:8080/article.aspx?id=123&title=fabrikam では、ホストの値は contoso.com になりますExample: in the request http://contoso.com:8080/article.aspx?id=123&title=fabrikam, host value will be is contoso.com
cookie_namecookie_name name クッキー。The name cookie.
http_methodhttp_method URL 要求を行うために使用されたメソッド。The method used to make the URL request. たとえば、GET、POST などです。For example, GET or POST.
http_statushttp_status セッションの状態。The session status. たとえば、200、400、403 です。For example, 200, 400, or 403.
http_versionhttp_version 要求プロトコル。The request protocol. 通常、HTTP/1.0、HTTP/1.1、または HTTP/2.0 です。Usually HTTP/1.0, HTTP/1.1, or HTTP/2.0.
query_stringquery_string 要求された URL 内で "?" の後にある、変数と値のペアから成る一覧。The list of variable/value pairs that follows the "?" in the requested URL. 例: 要求 http://contoso.com:8080/article.aspx?id=123&title=fabrikam では、query_string 値は id=123&title=fabrikam になりますExample: in the request http://contoso.com:8080/article.aspx?id=123&title=fabrikam, query_string value will be id=123&title=fabrikam
received_bytesreceived_bytes 要求の長さ (要求行、ヘッダー、および要求本文を含む)。The length of the request (including the request line, header, and request body).
request_queryrequest_query 要求行内の引数。The arguments in the request line.
request_schemerequest_scheme 要求スキーム。http または https です。The request scheme: http or https.
request_urirequest_uri 完全な元の要求 URI (引数を含む)。The full original request URI (with arguments). 例: 要求 http://contoso.com:8080/article.aspx?id=123&title=fabrikam では、request_uri 値は /article.aspx?id=123&title=fabrikam になりますExample: in the request http://contoso.com:8080/article.aspx?id=123&title=fabrikam, request_uri value will be /article.aspx?id=123&title=fabrikam
sent_bytessent_bytes クライアントに送信されたバイト数。The number of bytes sent to a client.
server_portserver_port 要求を受け付けたサーバーのポート。The port of the server that accepted a request.
ssl_connection_protocolssl_connection_protocol 確立された TLS 接続のプロトコル。The protocol of an established TLS connection.
ssl_enabledssl_enabled 接続が TLS モードで動作する場合は “オン”。“On” if the connection operates in TLS mode. それ以外の場合は、空の文字列です。Otherwise, an empty string.
uri_pathuri_path Web クライアントがアクセスする必要があるホスト内の特定のリソースを識別します。Identifies the specific resource in the host that the web client wants to access. これは、引数を含まない要求 URI の部分です。This is the part of the request URI without the arguments. 例: 要求 http://contoso.com:8080/article.aspx?id=123&title=fabrikam では、uri_path 値は /article.aspx になりますExample: in the request http://contoso.com:8080/article.aspx?id=123&title=fabrikam, uri_path value will be /article.aspx

書き換えの構成Rewrite configuration

HTTP ヘッダーの書き換えを構成するには、次の手順のようにする必要があります。To configure HTTP header rewrite, you need to complete these steps.

  1. HTTP ヘッダーの書き換えに必要なオブジェクトを作成します。Create the objects that are required for HTTP header rewrite:

    • 書き換えアクション:書き換えようとしている要求フィールドと要求ヘッダー フィールド、およびヘッダーの新しい値を指定するために使用されます。Rewrite action: Used to specify the request and request header fields that you want to rewrite and the new value for the headers. 1 つ以上の書き換え条件を 1 つの書き換えアクションに関連付けることができます。You can associate one or more rewrite conditions with a rewrite action.

    • 書き換え条件:オプションの構成。Rewrite condition: An optional configuration. 書き換え条件では、HTTP(S) の要求と応答の内容が評価されます。Rewrite conditions evaluate the content of the HTTP(S) requests and responses. HTTP(S) の要求または応答が書き換え条件に一致する場合、書き換えアクションが発生します。The rewrite action will occur if the HTTP(S) request or response matches the rewrite condition.

      複数の条件を 1 つのアクションと関連付けた場合は、すべての条件が満たされた場合にのみアクションが発生します。If you associate more than one condition with an action, the action occurs only when all the conditions are met. つまり、操作は論理 AND 操作です。In other words, the operation is a logical AND operation.

    • 書き換え規則:複数の書き換えアクション/書き換え条件の組み合わせが含まれます。Rewrite rule: Contains multiple rewrite action / rewrite condition combinations.

    • 規則のシーケンス:書き換え規則の実行順序を決定するのに役立ちます。Rule sequence: Helps determine the order in which the rewrite rules execute. この構成は、書き換えセットに複数の書き換え規則がある場合に便利です。This configuration is helpful when you have multiple rewrite rules in a rewrite set. 規則のシーケンスの値が小さい書き換え規則から先に実行されます。A rewrite rule that has a lower rule sequence value runs first. 2 つの書き換え規則に同じ規則のシーケンスを割り当てた場合、実行順序は非決定論的となります。If you assign the same rule sequence to two rewrite rules, the order of execution is non-deterministic.

    • 書き換えセット:要求ルーティング規則に関連付けられる複数の書き換え規則が含まれます。Rewrite set: Contains multiple rewrite rules that will be associated with a request routing rule.

  2. 書き換えセット (rewriteRuleSet) をルーティング規則にアタッチします。Attach the rewrite set (rewriteRuleSet) to a routing rule. 書き換え構成が、ルーティング規則によってソース リスナーにアタッチされます。The rewrite configuration is attached to the source listener via the routing rule. 基本ルーティング規則を使うと、ヘッダー書き換え構成はソース リスナーに関連付けられ、グローバルなヘッダーの書き換えになります。When you use a basic routing rule, the header rewrite configuration is associated with a source listener and is a global header rewrite. パスベースのルーティング規則を使うと、ヘッダー書き換え構成は URL パス マップで定義されます。When you use a path-based routing rule, the header rewrite configuration is defined on the URL path map. その場合、サイトの特定のパス領域にのみ適用されます。In that case, it applies only to the specific path area of a site.

    注意

    URL 書き換えではヘッダーが変更されます。パスの URL は変更されません。URL Rewrite alter the headers; it does not change the URL for the path.

HTTP ヘッダーの書き換えセットを複数作成し、それぞれの書き換えセットを複数のリスナーに適用することができます。You can create multiple HTTP header rewrite sets and apply each rewrite set to multiple listeners. ただし、特定のリスナーに対して適用できる書き換えセットは 1 つだけです。But you can apply only one rewrite set to a specific listener.

一般的なシナリオCommon scenarios

ヘッダーの書き換えを使用するための一般的なシナリオを以下に示します。Here are some common scenarios for using header rewrite.

X-Forwarded-For ヘッダーからポート情報を削除するRemove port information from the X-Forwarded-For header

Application Gateway では、要求をバックエンドに転送する前に、すべての要求に X-Forwarded-For ヘッダーが挿入されます。Application Gateway inserts an X-Forwarded-For header into all requests before it forwards the requests to the backend. このヘッダーは、IP ポート のコンマ区切りリストです。This header is a comma-separated list of IP ports. バック エンド サーバーでヘッダーに IP アドレスが含まれることだけが必要なシナリオがあるとします。There might be scenarios in which the back-end servers only need the headers to contain IP addresses. ヘッダーの書き換えを使用して X-Forwarded-For ヘッダーからポート情報を削除できます。You can use header rewrite to remove the port information from the X-Forwarded-For header. これを行う 1 つの方法は、ヘッダーを add_x_forwarded_for_proxy サーバー変数に設定することです。One way to do this is to set the header to the add_x_forwarded_for_proxy server variable:

ポートを削除する

リダイレクト URL を変更するModify a redirection URL

バックエンド アプリケーションでリダイレクト応答が送信されるとき、バックエンド アプリケーションで指定されているものとは別の URL にクライアントをリダイレクトしたい場合があります。When a back-end application sends a redirection response, you might want to redirect the client to a different URL than the one specified by the back-end application. たとえば、アプリ サービスがアプリケーション ゲートウェイの背後でホストされており、クライアントに相対パスへのリダイレクトを行わせる必要があるときに、これを行えます。For example, you might want to do this when an app service is hosted behind an application gateway and requires the client to do a redirection to its relative path. (たとえば、contoso.azurewebsites.net/path1 から contoso.azurewebsites.net/path2 へのリダイレクトです)。(For example, a redirect from contoso.azurewebsites.net/path1 to contoso.azurewebsites.net/path2.)

App Service はマルチテナント サービスであるため、要求のホスト ヘッダーを使用して適切なエンドポイントに要求をルーティングします。Because App Service is a multitenant service, it uses the host header in the request to route the request to the correct endpoint. アプリ サービスの既定のドメイン名 *.azurewebsites.net (たとえば contoso.azurewebsites.net) は、アプリケーション ゲートウェイのドメイン名 (たとえば contoso.com) とは異なります。App services have a default domain name of *.azurewebsites.net (say contoso.azurewebsites.net) that's different from the application gateway's domain name (say contoso.com). クライアントからの元の要求には、ホスト名としてアプリケーション ゲートウェイのドメイン名 contoso.com が設定されているので、アプリケーション ゲートウェイでホスト名を contoso.azurewebsites.net に変更します。Because the original request from the client has the application gateway's domain name (contoso.com) as the hostname, the application gateway changes the hostname to contoso.azurewebsites.net. アプリ サービスが適切なエンドポイントに要求をルーティングできるようにこの変更を行います。It makes this change so that the app service can route the request to the correct endpoint.

アプリ サービスでは、リダイレクト応答を送信するとき、その応答の場所ヘッダーで、アプリケーション ゲートウェイから受信した要求のものと同じホスト名が使用されます。When the app service sends a redirection response, it uses the same hostname in the location header of its response as the one in the request it receives from the application gateway. そのため、クライアントでは、アプリケーション ゲートウェイ (contoso.com/path2) を経由するのではなく、contoso.azurewebsites.net/path2 に直接要求を行います。So the client will make the request directly to contoso.azurewebsites.net/path2 instead of going through the application gateway (contoso.com/path2). アプリケーション ゲートウェイをバイパスすることは望ましくありません。Bypassing the application gateway isn't desirable.

この問題は、場所ヘッダーのホスト名をアプリケーション ゲートウェイのドメイン名に設定することで解決できます。You can resolve this issue by setting the hostname in the location header to the application gateway's domain name.

ホスト名を置換する手順を次に示します。Here are the steps for replacing the hostname:

  1. 応答の場所ヘッダーに azurewebsites.net が含まれているかどうかを評価する条件で書き換え規則を作成します。Create a rewrite rule with a condition that evaluates if the location header in the response contains azurewebsites.net. パターン「(https?):\/\/.*azurewebsites\.net(.*)$」を入力します。Enter the pattern (https?):\/\/.*azurewebsites\.net(.*)$.
  2. アプリケーション ゲートウェイのホスト名を含むように、場所ヘッダーを書き換えるにアクションを実行します。Perform an action to rewrite the location header so that it has the application gateway's hostname. これを行うには、ヘッダー値として「{http_resp_Location_1}://contoso.com{http_resp_Location_2}」を入力します。Do this by entering {http_resp_Location_1}://contoso.com{http_resp_Location_2} as the header value.

場所ヘッダーを変更する

脆弱性を防ぐための HTTP セキュリティ ヘッダーを実装するImplement security HTTP headers to prevent vulnerabilities

アプリケーションの応答で必要なヘッダーを実装することにより、いくつかのセキュリティの脆弱性を修正できます。You can fix several security vulnerabilities by implementing necessary headers in the application response. たとえば、X-XSS-Protection、Strict-Transport-Security、Content-Security-Policy などのセキュリティ ヘッダーです。These security headers include X-XSS-Protection, Strict-Transport-Security, and Content-Security-Policy. Application Gateway を使用して、すべての応答にこれらのヘッダーを設定できます。You can use Application Gateway to set these headers for all responses.

セキュリティ ヘッダー

不要なヘッダーを削除するDelete unwanted headers

HTTP 応答から、機密情報を明らかにするヘッダーを削除することができます。You might want to remove headers that reveal sensitive information from an HTTP response. たとえば、バックエンド サーバー名、オペレーティング システム、ライブラリの詳細などの情報を削除できます。For example, you might want to remove information like the back-end server name, operating system, or library details. アプリケーション ゲートウェイを使用して、これらのヘッダーを削除できます。You can use the application gateway to remove these headers:

ヘッダーを削除する

ヘッダーの有無を確認するCheck for the presence of a header

HTTP 要求または応答ヘッダーを評価し、ヘッダーまたはサーバー変数の有無を確認できます。You can evaluate an HTTP request or response header for the presence of a header or server variable. この評価は、特定のヘッダーが存在する場合にのみヘッダーの書き換えを実行する場合に役立ちます。This evaluation is useful when you want to perform a header rewrite only when a certain header is present.

ヘッダーの有無を確認する

制限事項Limitations

  • 応答内に同じ名前のヘッダーが複数含まれている場合、これらのヘッダーのいずれかの値を書き換えると、応答内の他のヘッダーが破棄されます。If a response has more than one header with the same name, then rewriting the value of one of those headers will result in dropping the other headers in the response. 応答に複数の Set-Cookie ヘッダーを設定できるので、これは通常、Set-Cookie ヘッダーで発生します。This can usually happen with Set-Cookie header since you can have more than one Set-Cookie header in a response. このようなシナリオの 1 つが、アプリ サービスをアプリケーション ゲートウェイとともに使用していて、アプリケーション ゲートウェイで Cookie ベースのセッション アフィニティを構成している場合です。One such scenario is when you are using an app service with an application gateway and have configured cookie-based session affinity on the application gateway. この場合、応答には 2 つの Set-Cookie ヘッダーが含まれ、1 つはアプリ サービスで使用されるもの (Set-Cookie: ARRAffinity=ba127f1caf6ac822b2347cc18bba0364d699ca1ad44d20e0ec01ea80cda2a735;Path=/;HttpOnly;Domain=sitename.azurewebsites.net) で、もう 1 つはアプリケーション ゲートウェイ アフィニティ用 (Set-Cookie: ApplicationGatewayAffinity=c1a2bd51lfd396387f96bl9cc3d2c516; Path=/) です。In this case the response will contain two Set-Cookie headers: one used by the app service, for example: Set-Cookie: ARRAffinity=ba127f1caf6ac822b2347cc18bba0364d699ca1ad44d20e0ec01ea80cda2a735;Path=/;HttpOnly;Domain=sitename.azurewebsites.net and another for application gateway affinity, for example, Set-Cookie: ApplicationGatewayAffinity=c1a2bd51lfd396387f96bl9cc3d2c516; Path=/. このシナリオでどちらかの Set-Cookie ヘッダーを書き換えると、もう一方の Set-Cookie ヘッダーが応答から削除されることがあります。Rewriting one of the Set-Cookie headers in this scenario can result in removing the other Set-Cookie header from the response.

  • アプリケーション ゲートウェイが要求をリダイレクトするように構成されている場合、またはカスタム エラー ページを表示するように構成されている場合は、書き換えはサポートされません。Rewrites are not supported when the application gateway is configured to redirect the requests or to show a custom error page.

  • Connection、Upgrade、および Host の各ヘッダーの書き換えは現在サポートされていません。Rewriting the Connection, Upgrade, and Host headers isn't currently supported.

  • ヘッダー名には、任意の英数字と、RFC 7230 で定義されている特定の記号を含めることができます。Header names can contain any alphanumeric characters and specific symbols as defined in RFC 7230. 現在はヘッダー名内で特殊文字のアンダー スコア (_) がサポートされていません。We don't currently support the underscore (_) special character in Header names.

次のステップNext steps

HTTP ヘッダーを書き換える方法について学習するには、以下をご覧ください。To learn how to rewrite HTTP headers, see: