Risolvere i problemi del servizio app nel gateway applicazione

Informazioni su come diagnosticare e risolvere i problemi che possono verificarsi quando Servizio app di Azure viene usato come destinazione back-end con gateway applicazione di Azure.

Panoramica

In questo articolo si apprenderà come risolvere i problemi seguenti:

  • L'URL del servizio app viene esposto nel browser quando è presente un reindirizzamento.
  • Il dominio del cookie ARRAffinity del servizio app è impostato sul nome host del servizio app, example.azurewebsites.net, anziché sull'host originale.

Quando un'applicazione back-end invia una risposta di reindirizzamento, è possibile reindirizzare il client a un URL diverso da quello specificato dall'applicazione back-end. È possibile eseguire questa operazione quando un servizio app è ospitato dietro un gateway applicazione e richiede al client di eseguire un reindirizzamento al relativo percorso. Un esempio è un reindirizzamento da contoso.azurewebsites.net/path1 a contoso.azurewebsites.net/path2.

Quando il servizio app invia una risposta di reindirizzamento, usa lo stesso nome host nell'intestazione location della risposta come quello nella richiesta che riceve dal gateway applicazione. Ad esempio, il client effettua la richiesta direttamente contoso.azurewebsites.net/path2 invece di passare attraverso il gateway applicazione contoso.com/path2. Non si vuole ignorare il gateway applicazione.

Questo problema può verificarsi per i motivi principali seguenti:

  • Il reindirizzamento è stato configurato nel servizio app. Il reindirizzamento può essere semplice quanto aggiungere una barra finale alla richiesta.
  • È stata Azure Active Directory autenticazione, che causa il reindirizzamento.

Inoltre, quando si usano i servizi app dietro un gateway applicazione, il nome di dominio associato al gateway applicazione (example.com) è diverso dal nome di dominio del servizio app (ad esempio, example.azurewebsites.net). Il valore di dominio per il cookie ARRAffinity impostato dal servizio app contiene example.azurewebsites.net nome di dominio, che non è consigliabile. Il nome host originale, example.com, deve essere il valore del nome di dominio nel cookie.

Configurazione di esempio

  • Listener HTTP: di base o multisnodato
  • Pool di indirizzi back-end: Servizio app
  • Impostazioni HTTP: Selezionare il nome host dall'indirizzo back-end abilitato
  • Probe: Selezionare il nome host dalle impostazioni HTTP abilitato

Causa

Il servizio app è un servizio multi-tenant, quindi usa l'intestazione host nella richiesta per instradare la richiesta all'endpoint corretto. Il nome di dominio predefinito di Servizi app, *.azurewebsites.net (ad esempio, contoso.azurewebsites.net), è diverso dal nome di dominio del gateway applicazione (ad esempio, contoso.com).

La richiesta originale dal client ha il nome di dominio del gateway applicazione, contoso.com, come nome host. È necessario configurare il gateway applicazione per modificare il nome host nella richiesta originale con il nome host del servizio app quando la richiesta viene instradato al back-end del servizio app. Usare l'opzione Seleziona nome host da indirizzo back-end nella configurazione delle impostazioni HTTP del gateway applicazione. Usare l'opzione Seleziona nome host dalle impostazioni HTTP back-end nella configurazione del probe di integrità.

Il gateway applicazione modifica il nome host

Quando il servizio app esegue un reindirizzamento, usa il nome host sottoposto a override contoso.azurewebsites.net nell'intestazione del percorso anziché il nome host originale contoso.com, se non diversamente configurato. Controllare le intestazioni di richiesta e risposta di esempio seguenti.

## Request headers to Application Gateway:

Request URL: http://www.contoso.com/path

Request Method: GET

Host: www.contoso.com

## Response headers:

Status Code: 301 Moved Permanently

Location: http://contoso.azurewebsites.net/path/

Server: Microsoft-IIS/10.0

Set-Cookie: ARRAffinity=b5b1b14066f35b3e4533a1974cacfbbd969bf1960b6518aa2c2e2619700e4010;Path=/;HttpOnly;Domain=contoso.azurewebsites.net

X-Powered-By: ASP.NET

Nell'esempio precedente si noti che l'intestazione della risposta ha un codice di stato 301 per il reindirizzamento. L'intestazione location ha il nome host del servizio app anziché il nome host originale www.contoso.com .

Soluzione: riscrivere l'intestazione location

Impostare il nome host nell'intestazione location sul nome di dominio del gateway applicazione. A tale scopo, creare una regola di riscrittura con una condizione che valuta se l'intestazione location nella risposta contiene azurewebsites.net. Deve anche eseguire un'azione per riscrivere l'intestazione della posizione in modo che abbia il nome host del gateway applicazione. Per altre informazioni, vedere le istruzioni su come riscrivere l'intestazione location.

Nota

Il supporto per la riscrittura dell'intestazione HTTP è disponibile solo per lo SKU Standard_v2 e WAF_v2 del gateway applicazione. È consigliabile eseguire la migrazione alla versione 2 per la riscrittura dell'intestazione e altre funzionalità avanzate disponibili con lo SKU v2.

Soluzione alternativa: usare un nome di dominio personalizzato

L'uso della funzionalità Custom Domain app è un'altra soluzione per reindirizzare sempre il traffico al nome di dominio del gateway applicazione ( www.contoso.com in questo esempio). Questa configurazione funge anche da soluzione per il problema dei cookie di affinità di ARR. Per impostazione predefinita, il dominio del cookie ARRAffinity è impostato sul nome host predefinito del servizio app (example.azurewebsites.net) anziché sul nome di dominio del gateway applicazione. Pertanto, il browser in questi casi rifiuterà il cookie a causa della differenza nei nomi di dominio della richiesta e del cookie.

È possibile seguire il metodo specificato per i problemi di mancata corrispondenza del dominio cookie di Reindirizzamento e ARRAffinity. Questo metodo dovrà disporre dell'accesso alla zona DNS del dominio personalizzato.

Passaggio 1: Impostare un Custom Domain nel servizio app e verificare la proprietà del dominio aggiungendo il record CNAME& RECORD DNS TXT . I record sono simili a

  • www.contoso.com IN CNAME contoso.azurewebsite.net
  • asuid.www.contoso.com IN TXT " <verification id string> "

Passaggio 2: il record CNAME nel passaggio precedente era necessario solo per la verifica del dominio. In definitiva, è necessario che il traffico sia instradato tramite il gateway applicazione. È quindi possibile modificare il www.contoso.com CNAME di ora in modo che punti al nome di dominio completo del gateway applicazione. Per impostare un nome di dominio completo per il gateway applicazione, passare alla relativa risorsa indirizzo IP pubblico e assegnare un'etichetta del nome DNS. Il record CNAME aggiornato dovrebbe ora essere simile a

  • www.contoso.com IN CNAME contoso.eastus.cloudapp.azure.com

Passaggio 3: disabilitare "Seleziona nome host da indirizzo back-end" per l'impostazione HTTP associata.

In PowerShell non usare -PickHostNameFromBackendAddress l'opzione nel Set-AzApplicationGatewayBackendHttpSettings comando .

Passaggio 4: per determinare il back-end come integro e come traffico operativo, impostare un probe di integrità personalizzato con il campo Host come dominio personalizzato o predefinito del servizio app.

In PowerShell non usare l'opzione nel comando e usare il dominio personalizzato o predefinito del servizio app nell'opzione -PickHostNameFromBackendHttpSettings Set-AzApplicationGatewayProbeConfig -HostName del probe.

Per implementare i passaggi precedenti usando PowerShell per un'installazione esistente, usare lo script di PowerShell di esempio seguente. Si noti che non sono state usate le opzioni -PickHostname nella configurazione delle impostazioni HTTP e del probe.

$gw=Get-AzApplicationGateway -Name AppGw1 -ResourceGroupName AppGwRG
Set-AzApplicationGatewayProbeConfig -ApplicationGateway $gw -Name AppServiceProbe -Protocol Http -HostName "example.azurewebsites.net" -Path "/" -Interval 30 -Timeout 30 -UnhealthyThreshold 3
$probe=Get-AzApplicationGatewayProbeConfig -Name AppServiceProbe -ApplicationGateway $gw
Set-AzApplicationGatewayBackendHttpSettings -Name appgwhttpsettings -ApplicationGateway $gw -Port 80 -Protocol Http -CookieBasedAffinity Disabled -Probe $probe -RequestTimeout 30
Set-AzApplicationGateway -ApplicationGateway $gw
## Request headers to Application Gateway:

Request URL: http://www.contoso.com/path

Request Method: GET

Host: www.contoso.com

## Response headers:

Status Code: 301 Moved Permanently

Location: http://www.contoso.com/path/

Server: Microsoft-IIS/10.0

Set-Cookie: ARRAffinity=b5b1b14066f35b3e4533a1974cacfbbd969bf1960b6518aa2c2e2619700e4010;Path=/;HttpOnly;Domain=www.contoso.com

X-Powered-By: ASP.NET

Passaggi successivi

Se i passaggi precedenti non hanno risolto il problema, aprire un ticket di supporto.