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.
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.
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=fabrikam kommer 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=fabrikam kommer 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=fabrikam kommer 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:
Ä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:
- Skapa en omskrivningsregel med ett villkor som utvärderar om platsrubriken i svaret innehåller azurewebsites.net. Ange mönstret
(https?):\/\/.*azurewebsites\.net(.*)$
. - 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 servervariabelnhost
för att ange värdnamnet så att det matchar den ursprungliga begäran.
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.
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:
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.
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
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
Steg 2 (b): Associera den här omskrivningsuppsättningen med standardsökvägen för den sökvägsbaserade regeln ovan
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 /(.+)/(.+)
Å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}
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.
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
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för