Azure

Application GatewayのバックエンドがApp Serviceの場合はリダイレクト対策が必要です。

はじめに

App Serviceでは最後にスラッシュ「/」がある場合にはリダイレクトされることを解説しました。

App ServiceではURLの最後にスラッシュ「/」が無いとリダイレクトされてしまう。 - 技術的な何か。
App ServiceではURLの最後にスラッシュ「/」が無いとリダイレクトされてしまう。 - 技術的な何か。

はじめに App Serviceの特徴の一つとしてURLの最後にスラッシュ「/」が無い場合には、リダイレクトされて勝手にスラッシュ「/」が付きます。 これはドキュメントルートの下層ディレクトリで起こり

level69.net

単一のApp Serviceで運用する場合には、特に気にする必要はないと思います。

問題になってくるのはApplication GatewayのバックエンドにApp Serviceを指定した場合です。

図のように①でアクセスします。すると、App Service(バックエンド)は②で受け取ります。前回説明したように、App Serviceは最後のスラッシュ「/」がないためリダイレクトしようとします。この時、App ServiceはLocationヘッダーに自ドメイン aaa.azurewebsite.net でリダイレクトしようとします。

すると、Application Gatewayからのみ通信を許可している場合にはApp Serviceへアクセスできず、403が表示されます。

curlで確認する

# curl -I https://www.server01.pw/bbb
HTTP/1.1 301 Moved Permanently
Date: Sun, 26 Dec 2021 14:08:11 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 169
Connection: keep-alive
Location: https://appsv000001.azurewebsites.net:443/bbb/
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=4c11587e94349dd42c6fc02464b867022d6138c72620787a410e416b3ae10e84;Path=/;HttpOnly;Secure;Domain=appsv000001.azurewebsites.net:443
Set-Cookie: ARRAffinitySameSite=4c11587e94349dd42c6fc02464b867022d6138c72620787a410e416b3ae10e84;Path=/;HttpOnly;SameSite=None;Secure;Domain=appsv000001.azurewebsites.net:443

 

これは対策方法がドキュメントに記載されています。

Azure Application Gateway で HTTP ヘッダーと URL を書き換える | Microsoft Learn
Azure Application Gateway で HTTP ヘッダーと URL を書き換える | Microsoft Learn

この記事では、Azure Application Gateway での HTTP ヘッダーと URL の書き換えの概要を説明します

docs.microsoft.com

なんか長文で書かれていますが、スラッシュ「/」だけでなく、リダイレクト全般での対方法が書かれています。

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

設定は、Application Gatewayの書き換えの設定を行います。

ドキュメントにも書かれていますが下記の設定を行います。

  • パターン
    (https?):\/\/.*azurewebsites\.net(.*)$
  • ヘッダー値
    {http_resp_Location_1}://contoso.com{http_resp_Location_2}

書き換えセットを作成します。

適用するルールは、大体は基本規則の部分だと思います。

書き換え規則の追加を行った後、条件の追加を行います。

Ifが追加されること確認します。

Ifをクリックして設定します。

次に、結果をクリックして設定します。

簡単に説明すると、応答ヘッダー(App Serviceがクライアントへ返すヘッダー)のLocationを書き換えています。

正規表現でかっこの中がそれぞれそのままヘッダー値となります。

(https?)→{http_resp_Location_1}

(.*)→{http_resp_Location_2}

それ以外、例では.*azurewebsites.netcontoso.com に変換しています。

contoso.comの部分を自分のドメインに変えます。

設定は以上です。

応答ヘッダーを書き換えた場合の動作は下記のようになります。

curlでヘッダーを確認すると

curl -I https://www.server01.pw/bbb
HTTP/1.1 301 Moved Permanently
Date: Sun, 26 Dec 2021 15:37:36 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 169
Connection: keep-alive
Location: https://www.server01.pw:443/bbb/
Server: Microsoft-IIS/10.0
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=4c11587e94349dd42c6fc02464b867022d6138c72620787a410e416b3ae10e84;Path=/;HttpOnly;Secure;Domain=appsv000001.azurewebsites.net:443
Set-Cookie: ARRAffinitySameSite=4c11587e94349dd42c6fc02464b867022d6138c72620787a410e416b3ae10e84;Path=/;HttpOnly;SameSite=None;Secure;Domain=appsv000001.azurewebsites.net:443

 

まとめ

他にも、App Serviceにカスタムドメインを割り当てる方法もありますが、運用面を考慮した場合、証明書の設定なども発生するので個人的にはお勧めできません。

今回はApplication GatewayのバックエンドにApp Serviceを設定した場合のリダイレクトの対策を紹介しました。

これは、前回のスラッシュ「/」の対策の場面でも使えます。むしろ必須作業ではないでしょうか。テストでは気づかない場合もあります。事前に対策を打つ方が得策なのではないでしょうか。

-Azure
-,