Skriv om HTTP-huvuden och URL:en med Application Gateway

Med Application Gateway kan du skriva om det valda innehållet i begäranden och svar. Med den här funktionen kan du översätta URL:er, frågesträngsparametrar samt ändra begärande- och svarshuvuden. Du kan också lägga till villkor för att se till att URL:en eller de angivna rubrikerna skrivs om endast när vissa villkor uppfylls. Dessa villkor baseras på informationen för begäran och svar.

Kommentar

HTTP-huvud- och URL-omskrivningsfunktioner är endast tillgängliga för Application Gateway v2 SKU

Skriv om typer som stöds

Begärande- och svarshuvuden

MED HTTP-huvuden kan en klient och server skicka ytterligare information med en begäran eller ett svar. Genom att skriva om dessa rubriker kan du utföra viktiga uppgifter, till exempel att lägga till säkerhetsrelaterade rubrikfält som HSTS/X-XSS-Protection, ta bort fält för svarshuvud som kan avslöja känslig information och ta bort portinformation från X-Forwarded-For-huvuden.

Med Application Gateway kan du lägga till, ta bort eller uppdatera HTTP-begärande- och svarshuvuden medan begärande- och svarspaketen flyttas mellan klient- och serverdelspoolerna.

Mer information om hur du skriver om begärande- och svarshuvuden med Application Gateway med Hjälp av Azure-portalen finns här.

img

Rubriker som stöds

Du kan skriva om alla rubriker i begäranden och svar, förutom Anslut ion och uppgraderingshuvuden. Du kan också använda programgatewayen för att skapa anpassade huvuden och lägga till dem i de begäranden och svar som dirigeras genom den.

URL-sökväg och frågesträng

Med funktionen för URL-omskrivning i Application Gateway kan du:

  • Skriv om värdnamnet, sökvägen och frågesträngen för begärande-URL:en

  • Välj att skriva om URL:en för alla begäranden på en lyssnare eller endast de begäranden som matchar ett eller flera av de villkor som du anger. Dessa villkor baseras på egenskaperna för begäran (begärandehuvud och servervariabler).

  • Välj att dirigera begäran (välj serverdelspoolen) baserat på antingen den ursprungliga URL:en eller den omskrivna URL:en

Mer information om hur du skriver om URL:en med Application Gateway med Hjälp av Azure-portalen finns här.

Diagram that describes the process for rewriting a URL with Application Gateway.

Skriv om åtgärder

Du använder omskrivningsåtgärder för att ange URL:en, begärandehuvuden eller svarshuvuden som du vill skriva om och det nya värde som du tänker skriva om dem till. Värdet för en URL eller ett nytt eller befintligt huvud kan anges till följande typer av värden:

  • Text
  • Begärandehuvud. Om du vill ange en begäranderubrik måste du använda syntaxen {http_req_headerName}
  • Svarshuvud. Om du vill ange ett svarshuvud måste du använda syntaxen {http_resp_headerName}
  • Servervariabel. Om du vill ange en servervariabel måste du använda syntaxen {var_serverVariable}. Se listan över servervariabler som stöds
  • En kombination av text, ett begärandehuvud, ett svarshuvud och en servervariabel.

Skriv om villkor

Du kan använda omskrivningsvillkor, en valfri konfiguration, för att utvärdera innehållet i HTTP(S) begäranden och svar och utföra en omskrivning endast när ett eller flera villkor uppfylls. Programgatewayen använder dessa typer av variabler för att utvärdera innehållet i begäranden och svar:

  • HTTP-huvuden i begäran
  • HTTP-huvuden i svaret
  • Application Gateway-servervariabler

Du kan använda ett villkor för att utvärdera om en angiven variabel finns, om en angiven variabel matchar ett visst värde eller om en angiven variabel matchar ett specifikt mönster.

Mönstermatchning

Application Gateway använder reguljära uttryck för mönstermatchning i villkoret. Du bör använda RE2-kompatibla uttryck (Regular Expression 2) när du skriver dina villkor. Om du kör en Application Gateway Web Application Firewall (WAF) med Core Rule Set 3.1 eller tidigare kan du stöta på problem när du använder PCRE (Perl Compatible Regular Expressions) när du gör lookahead- och lookbehind-försäkran (negativa eller positiva).

Fånga

Om du vill samla in en delsträng för senare användning placerar du parenteser runt undermönstret som matchar det i villkoret regex definition. Det första par parenteserna lagrar sin delsträng i 1, det andra paret i 2 och så vidare. Du kan använda så många parenteser som du vill. Perl definierar bara fler numrerade variabler så att du kan representera dessa insamlade strängar. Några exempel från referens:

  • (\d) (\d) # Matcha två siffror och samla in dem i grupperna 1 och 2

  • (\d+) # Matcha en eller flera siffror och samla in alla i grupp 1

  • (\d)+ # Matcha en siffra en eller flera gånger och samla in det sista i grupp 1

Kommentar

Användning av / till prefix och suffix som mönstret inte ska anges i mönstret för att matcha värdet. Till exempel matchar (\d)(\d) två siffror. /(\d)(\d)/ matchar inte två siffror.

När du har hämtat dem kan du referera till dem i åtgärdsuppsättningen med följande format:

  • För en avbildning av begäranderubriken måste du använda {http_req_headerName_groupNumber}. Till exempel {http_req_User-Agent_1} eller {http_req_User-Agent_2}
  • För en avbildning av svarsrubriken måste du använda {http_resp_headerName_groupNumber}. Till exempel {http_resp_Location_1} eller {http_resp_Location_2}
  • För en servervariabel måste du använda {var_serverVariableName_groupNumber}. Till exempel {var_uri_path_1} eller {var_uri_path_2}

Kommentar

Fallet med villkorsvariabeln måste matcha fallet med avbildningsvariabeln. Om min villkorsvariabel till exempel är User-Agent måste min avbildningsvariabel vara för User-Agent (dvs. {http_req_User-Agent_2}). Om min villkorsvariabel definieras som user-agent måste min avbildningsvariabel vara för user-agent (dvs. {http_req_user-agent_2}).

Om du vill använda hela värdet bör du inte nämna talet. Använd bara formatet {http_req_headerName}, osv. utan groupNumber.

Servervariabler

Application Gateway använder servervariabler för att lagra användbar information om servern, anslutningen till klienten och den aktuella begäran om anslutningen. Exempel på information som lagras är klientens IP-adress och webbläsartypen. Servervariabler ändras dynamiskt, till exempel när en ny sida läses in eller när ett formulär publiceras. Du kan använda dessa variabler för att utvärdera omskrivningsvillkor och skriva om rubriker. För att kunna använda värdet för servervariabler för att skriva om rubriker måste du ange dessa variabler i syntaxen {var_serverVariableName}

Application Gateway stöder följande servervariabler:

Variabelnamn Description
add_x_forwarded_for_proxy Fältet X-Forwarded-For-klientbegäran med variabeln client_ip (se förklaring senare i den här tabellen) läggs till i formatet IP1, IP2, IP3 och så vidare. Om fältet X-Forwarded-For inte finns i huvudet för klientbegäran är variabeln add_x_forwarded_for_proxy lika med variabeln $client_ip . Den här variabeln är särskilt användbar när du vill skriva om X-Forwarded-For-huvudet som angetts av Application Gateway så att rubriken endast innehåller IP-adressen utan portinformationen.
ciphers_supported En lista över chiffer som stöds av klienten.
ciphers_used Strängen med chiffer som används för en etablerad TLS-anslutning.
client_ip IP-adressen för klienten som programgatewayen tog emot begäran från. Om det finns en omvänd proxy före programgatewayen och den ursprungliga klienten client_ip returnerar IP-adressen för den omvända proxyn.
client_port Klientporten.
client_tcp_rtt Information om klientens TCP-anslutning. Finns på system som stöder alternativet TCP_INFO socket.
client_user När HTTP-autentisering används anges användarnamnet för autentisering.
värd I den här prioritetsordningen: värdnamnet från begäranderaden, värdnamnet från fältet Värdbegärans huvud eller servernamnet som matchar en begäran. Exempel: I begäran http://contoso.com:8080/article.aspx?id=123&title=fabrikamkommer värdvärdet att vara contoso.com
cookie_namn Namnet cookie.
http_method Den metod som används för att göra URL-begäran. Till exempel GET eller POST.
http_status Sessionsstatus. Till exempel 200, 400 eller 403.
http_version Protokollet för begäran. Vanligtvis HTTP/1.0, HTTP/1.1 eller HTTP/2.0.
query_string Listan över variabel/värde-par som följer "?" i den begärda URL:en. Exempel: I begäran http://contoso.com:8080/article.aspx?id=123&title=fabrikamkommer query_string värdet att vara id=123&title=fabrikam
received_bytes Längden på begäran (inklusive begäranderaden, rubriken och begärandetexten).
request_query Argumenten på begäranderaden.
request_scheme Begärandeschemat: http eller https.
request_uri Den fullständiga ursprungliga begärande-URI:n (med argument). Exempel: i begäran http://contoso.com:8080/article.aspx?id=123&title=fabrikam*kommer request_uri värdet att vara /article.aspx?id=123&title=fabrikam
sent_bytes Antalet byte som skickas till en klient.
server_port Porten för servern som accepterade en begäran.
ssl_connection_protocol Protokollet för en upprättad TLS-anslutning.
ssl_enabled "På" om anslutningen fungerar i TLS-läge. Annars en tom sträng.
uri_path Identifierar den specifika resursen i värden som webbklienten vill komma åt. Det här är en del av begärande-URI:n utan argumenten. Exempel: I begäran http://contoso.com:8080/article.aspx?id=123&title=fabrikamkommer uri_path värdet att vara /article.aspx

Servervariabler för ömsesidig autentisering

Application Gateway stöder följande servervariabler för scenarier med ömsesidig autentisering. Använd dessa servervariabler på samma sätt som ovan med de andra servervariablerna.

Variabelnamn Description
client_certificate Klientcertifikatet i PEM-format för en etablerad SSL-anslutning.
client_certificate_end_date Slutdatum för klientcertifikatet.
client_certificate_fingerprint SHA1-fingeravtrycket för klientcertifikatet för en etablerad SSL-anslutning.
client_certificate_issuer Strängen "issuer DN" för klientcertifikatet för en etablerad SSL-anslutning.
client_certificate_serial Serienumret för klientcertifikatet för en etablerad SSL-anslutning.
client_certificate_start_date Startdatumet för klientcertifikatet.
client_certificate_subject Strängen "ämnes-DN" för klientcertifikatet för en etablerad SSL-anslutning.
client_certificate_verification Resultatet av verifieringen av klientcertifikatet: SUCCESS, FAILED:<reason> eller NONE om ett certifikat inte fanns.

Skriva om konfiguration

För att konfigurera en omskrivningsregel måste du skapa en regeluppsättning för omskrivning och lägga till omskrivningsregelkonfigurationen i den.

En regeluppsättning för omskrivning innehåller:

  • Regelassociation för begäranden: Omskrivningskonfigurationen är associerad med källlyssnaren via routningsregeln. När du använder en grundläggande routningsregel associeras omskrivningskonfigurationen med en källlyssnare och är en global rubrikomskrivning. När du använder en sökvägsbaserad routningsregel definieras omskrivningskonfigurationen på URL-sökvägskartan. I så fall gäller det endast för det specifika sökvägsområdet för en webbplats. Du kan skapa flera omskrivningsuppsättningar och tillämpa varje omskrivningsuppsättning på flera lyssnare. Men du kan bara använda en omskrivning inställd på en specifik lyssnare.

  • Omskrivningsvillkor: Det är en valfri konfiguration. Omskrivningsvillkor utvärderar innehållet i HTTP(S) begäranden och svar. Omskrivningsåtgärden inträffar om HTTP(S)-begäran eller -svaret matchar omskrivningsvillkoret. Om du associerar fler än ett villkor med en åtgärd inträffar åtgärden endast när alla villkor uppfylls. Med andra ord är åtgärden en logisk AND-åtgärd.

  • Skriv om typ: Det finns tre typer av omskrivningar tillgängliga:

    • Skriva om begärandehuvuden
    • Skriva om svarshuvuden
    • Skriva om URL-komponenter
      • URL-sökväg: Värdet som sökvägen ska skrivas om till.
      • URL-frågesträng: Värdet som frågesträngen ska skrivas om till.
      • Utvärdera sökvägskartan igen: Används för att avgöra om url-sökvägskartan ska omvärderas eller inte. Om den bevaras avmarkerad används den ursprungliga URL-sökvägen för att matcha sökvägsmönstret i URL-sökvägskartan. Om värdet är true utvärderas url-sökvägskartan om för att kontrollera matchningen med den omskrivna sökvägen. Om du aktiverar den här växeln kan du dirigera begäran till en annan serverdelspool efter omskrivning.

Skriv om vanliga fallgropar i konfigurationen

  • Det går inte att aktivera "Utvärdera sökvägskartan igen" för grundläggande routningsregler för begäranden. Detta för att förhindra oändlig utvärderingsloop för en grundläggande routningsregel.

  • Det måste finnas minst en regel för villkorsstyrd omskrivning eller en omskrivningsregel som inte har "Utvärdera sökvägskartan" aktiverad för sökvägsbaserade routningsregler för att förhindra oändlig utvärderingsloop för en sökvägsbaserad routningsregel.

  • Inkommande begäranden skulle avslutas med en 500-felkod om en loop skapas dynamiskt baserat på klientindata. Application Gateway fortsätter att hantera andra begäranden utan försämring i ett sådant scenario.

Använda URL-omskrivning eller omskrivning av värdhuvud med Brandvägg för webbprogram (WAF_v2 SKU)

När du konfigurerar omskrivning av URL eller omskrivning av värdhuvud sker WAF-utvärderingen efter ändringen av begärandehuvudet eller URL-parametrarna (efter omskrivning). Och när du tar bort omskrivningen av URL:en eller omskrivningskonfigurationen för värdhuvuden på Application Gateway görs WAF-utvärderingen innan sidhuvudet skrivs om (förskrivning). Den här ordningen säkerställer att WAF-reglerna tillämpas på den slutliga begäran som tas emot av serverdelspoolen.

Anta till exempel att du har följande rubrikomskrivningsregel för rubriken "Accept" : "text/html" – om värdet för rubriken "Accept" är lika med "text/html"skriver du om värdet till "image/png".

Här, med endast rubrikomskrivning konfigurerad, görs WAF-utvärderingen på "Accept" : "text/html". Men när du konfigurerar omskrivning av URL eller omskrivning av värdhuvud görs WAF-utvärderingen på "Accept" : "image/png".

Vanliga scenarier för sidhuvudomskrivning

Ta bort portinformation från rubriken X-Forwarded-For

Application Gateway infogar ett X-Forwarded-For-huvud i alla begäranden innan begäranden vidarebefordras till serverdelen. Det här huvudet är en kommaavgränsad lista över IP-portar. Det kan finnas scenarier där serverdelsservrarna bara behöver rubrikerna för att innehålla IP-adresser. Du kan använda sidhuvudomskrivning för att ta bort portinformationen från rubriken X-Forwarded-For. Ett sätt att göra detta är att ange huvudet till add_x_forwarded_for_proxy servervariabeln. Du kan också använda variabeln client_ip:

Remove port

Ändra en omdirigerings-URL

Det kan vara användbart att ändra en omdirigerings-URL under vissa omständigheter. Till exempel: klienter omdirigerades ursprungligen till en sökväg som "/blog" men bör nu skickas till "/updates" på grund av en ändring i innehållsstrukturen.

Varning

Behovet av att ändra en omdirigerings-URL visas ibland i kontexten för en konfiguration där Application Gateway har konfigurerats för att åsidosätta värdnamnet mot serverdelen. Värdnamnet som visas av serverdelen skiljer sig i så fall från det värdnamn som visas i webbläsaren. I det här fallet skulle omdirigeringen inte använda rätt värdnamn. Denna konfiguration rekommenderas inte.

Begränsningarna och konsekvenserna av en sådan konfiguration beskrivs i Bevara det ursprungliga HTTP-värdnamnet mellan en omvänd proxy och dess serverdelswebbprogram. Den rekommenderade konfigurationen för App Service är att följa anvisningarna för "Anpassad domän (rekommenderas)" i Konfigurera App Service med Application Gateway. Att skriva om platsrubriken för svaret enligt beskrivningen i exemplet nedan bör betraktas som en lösning och tar inte upp rotorsaken.

När apptjänsten skickar ett omdirigeringssvar använder den samma värdnamn i platsrubriken för sitt svar som det i begäran som den tar emot från programgatewayen. Klienten skickar därför begäran direkt till i stället för att contoso.azurewebsites.net/path2 gå igenom programgatewayen (contoso.com/path2). Det är inte önskvärt att kringgå programgatewayen.

Du kan lösa det här problemet genom att ange värdnamnet i platshuvudet till programgatewayens domännamn.

Här följer stegen för att ersätta värdnamnet:

  1. Skapa en omskrivningsregel med ett villkor som utvärderar om platsrubriken i svaret innehåller azurewebsites.net. Ange mönstret (https?):\/\/.*azurewebsites\.net(.*)$.
  2. Utför en åtgärd för att skriva om platsrubriken så att den har programgatewayens värdnamn. Gör detta genom att ange {http_resp_Location_1}://contoso.com{http_resp_Location_2} som rubrikvärde. Du kan också använda servervariabeln host för att ange värdnamnet så att det matchar den ursprungliga begäran.

Modify location header

Implementera HTTP-huvuden för säkerhet för att förhindra sårbarheter

Du kan åtgärda flera säkerhetsrisker genom att implementera nödvändiga huvuden i programsvaret. Dessa säkerhetsrubriker omfattar X-XSS-Protection, Strict-Transport-Security och Content-Security-Policy. Du kan använda Application Gateway för att ange dessa huvuden för alla svar.

Security header

Ta bort oönskade rubriker

Du kanske vill ta bort rubriker som visar känslig information från ett HTTP-svar. Du kanske till exempel vill ta bort information som serverdelsserverns namn, operativsystem eller biblioteksinformation. Du kan använda programgatewayen för att ta bort dessa huvuden:

Deleting header

Kontrollera om det finns en rubrik

Du kan utvärdera en HTTP-begäran eller ett svarshuvud för förekomsten av en rubrik- eller servervariabel. Den här utvärderingen är användbar när du bara vill skriva om en rubrik när en viss rubrik finns.

Checking presence of a header

Vanliga scenarier för URL-omskrivning

Val av parameterbaserad sökväg

Om du vill utföra scenarier där du vill välja serverdelspoolen baserat på värdet för en rubrik, en del av URL:en eller frågesträngen i begäran, kan du använda kombinationen av url-omskrivningskapacitet och sökvägsbaserad routning. Om du till exempel har en shoppingwebbplats och produktkategorin skickas som frågesträng i URL:en och du vill dirigera begäran till serverdelen baserat på frågesträngen:

Steg 1: Skapa en sökvägskarta enligt bilden nedan

URL rewrite scenario 1-1.

Steg 2 (a): Skapa en omskrivningsuppsättning med 3 omskrivningsregler:

  • Den första regeln har ett villkor som kontrollerar query_string-variabeln för category=shoes och har en åtgärd som skriver om URL-sökvägen till /listing1 och har Åter utvärdera sökvägskarta aktiverad

  • Den andra regeln har ett villkor som kontrollerar query_string-variabeln för category=bags och har en åtgärd som skriver om URL-sökvägen till /listing2 och som har Återbearbeta sökvägskartanaktiverad

  • Den tredje regeln har ett villkor som kontrollerar query_string variabeln för category=accessories och har en åtgärd som skriver om URL-sökvägen till /listing3 och har Återbearbeta sökvägskartan aktiverad

URL rewrite scenario 1-2.

Steg 2 (b): Associera den här omskrivningsuppsättningen med standardsökvägen för den sökvägsbaserade regeln ovan

URL rewrite scenario 1-3.

Om användaren begär contoso.com/listing?category=any matchas den nu med standardsökvägen eftersom inget av sökvägsmönstren i sökvägskartan (/listing1, /listing2, /listing3) matchar. Eftersom du har associerat ovanstående omskrivningsuppsättning med den här sökvägen utvärderas den här omskrivningsuppsättningen. Eftersom frågesträngen inte matchar villkoret i någon av de tre omskrivningsreglerna i den här omskrivningsuppsättningen sker ingen omskrivningsåtgärd och därför dirigeras begäran oförändrad till den serverdel som är associerad med standardsökvägen (som är GenericList).

Om användaren begär contoso.com/listing?category=shoes matchas standardsökvägen igen. Men i det här fallet matchar villkoret i den första regeln och därför körs åtgärden som är associerad med villkoret som skriver om URL-sökvägen till /listing1 och utvärderar sökvägskartan igen. När sökvägskartan omvärderas matchar begäran nu sökvägen som är associerad med mönstret /listing1 och begäran dirigeras till den serverdel som är associerad med det här mönstret, som är ShoesListBackendPool.

Kommentar

Det här scenariot kan utökas till valfritt sidhuvud- eller cookievärde, URL-sökväg, frågesträngar eller servervariabler baserat på de villkor som definierats och gör att du i princip kan dirigera begäranden baserat på dessa villkor.

Skriv om frågesträngsparametrar baserat på URL:en

Överväg ett scenario med en shoppingwebbplats där länken som användaren ser ska vara enkel och läsbar, men serverdelsservern behöver frågesträngsparametrarna för att visa rätt innehåll.

I så fall kan Application Gateway samla in parametrar från URL:en och lägga till nyckel/värde-par för frågesträngar från dem från URL:en. Anta till exempel att användaren vill skriva om, https://www.contoso.com/fashion/shirts till https://www.contoso.com/buy.aspx?category=fashion&product=shirts, det kan uppnås genom följande URL-omskrivningskonfiguration.

Villkor – om servervariabeln uri_path är lika med mönstret /(.+)/(.+)

URL rewrite scenario 2-1.

Åtgärd – Ange URL-sökväg till buy.aspx och frågesträng till category={var_uri_path_1}&product={var_uri_path_2}

URL rewrite scenario 2-2.

En stegvis guide för att uppnå det scenario som beskrivs ovan finns i Skriva om URL med Application Gateway med Hjälp av Azure-portalen

Url-omskrivning jämfört med URL-omdirigering

För en URL-omskrivning skriver Application Gateway om URL:en innan begäran skickas till serverdelen. Detta ändrar inte vad användarna ser i webbläsaren eftersom ändringarna är dolda för användaren.

För en URL-omdirigering skickar Application Gateway ett omdirigeringssvar till klienten med den nya URL:en. Det kräver i sin tur att klienten skickar sin begäran till den nya URL:en som anges i omdirigeringen. Den URL som användaren ser i webbläsaren uppdateras till den nya URL:en.

Rewrite vs Redirect.

Begränsningar

  • Om ett svar har fler än en rubrik med samma namn kommer omskrivning av värdet för en av dessa rubriker att resultera i att de andra rubrikerna i svaret tas bort. Detta kan vanligtvis inträffa med Set-Cookie-huvudet eftersom du kan ha mer än en Set-Cookie-rubrik i ett svar. Ett sådant scenario är när du använder en apptjänst med en programgateway och har konfigurerat cookiebaserad sessionstillhörighet på programgatewayen. I det här fallet innehåller svaret två Set-Cookie-huvuden: en som används av apptjänsten, till exempel: Set-Cookie: ARRAffinity=ba127f1caf6ac822b2347cc18bba0364d699ca1ad44d20e0ec01ea80cda2a735;Path=/;HttpOnly;Domain=sitename.azurewebsites.net och en annan för tillhörighet mellan programgatewayer, Set-Cookie: ApplicationGatewayAffinity=c1a2bd51lfd396387f96bl9cc3d2c516; Path=/till exempel . Om du skriver om en av Set-Cookie-huvudena i det här scenariot kan det leda till att den andra Set-Cookie-rubriken tas bort från svaret.
  • Omskrivningar stöds inte när programgatewayen har konfigurerats för att omdirigera begäranden eller för att visa en anpassad felsida.
  • Namn på begäranderubriker kan innehålla alfanumeriska tecken och bindestreck. Rubriknamn som innehåller andra tecken ignoreras när en begäran skickas till serverdelsmålet.
  • Namn på svarshuvud kan innehålla alfanumeriska tecken och specifika symboler enligt definitionen i RFC 7230.
  • Anslut och uppgraderingshuvuden kan inte skrivas om
  • Omskrivningar stöds inte för 4xx- och 5xx-svar som genereras direkt från Application Gateway

Nästa steg