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åga efter strängparametrar och ä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.
Http-huvud- och URL-omskrivningsfunktionerna är endast tillgängliga för Application Gateway v2 SKU.
Begärande- och svarshuvuden
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. 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.
Du kan skriva om alla rubriker i begäranden och svar, förutom rubrikerna Connection
, och Upgrade
. 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. Mer information om hur du skriver om begärande- och svarshuvuden med Application Gateway med hjälp av Azure Portal finns här.
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 Portal finns här.
Förstå omskrivningar i Application Gateway
En omskrivningsuppsättning är en samling av en routningsregel, villkor och åtgärd.
Regelassociation för begäranden: Omskrivningskonfigurationen är associerad med en källlyssnare via routningsregeln. När du använder en routningsregel av typen Basic associeras omskrivningskonfigurationen med dess lyssnare och fungerar som en global omskrivning. När du använder en sökvägsbaserad routningsregel definieras omskrivningskonfigurationen enligt url-sökvägskartan. I det senare fallet gäller det endast för ett specifikt sökvägsområde på en plats. Du kan använda en omskrivningsuppsättning för flera routningsregler, men en routningsregel kan bara ha en omskrivning associerad med den.
Omskrivningsvillkor: Det här är en valfri konfiguration. Baserat på de villkor som du definierar utvärderar Application Gateway innehållet i HTTP(S) begäranden och svar. Den efterföljande "omskrivningsåtgärden" inträffar om HTTP(S) begäran eller svaret matchar det här villkoret. 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 det en logisk AND-åtgärd. Du kan använda omskrivningsvillkor för att utvärdera innehållet i HTTP-begäranden och svar. Med den här valfria konfigurationen kan du endast utföra en omskrivning 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:
Du kan välja följande typer för att söka efter ett villkor:
Med Villkor kan du utvärdera om det finns en angiven rubrik eller variabel genom att matcha deras värden via text eller ett Regex-mönster. För avancerade omskrivningskonfigurationer kan du även avbilda värdet för sidhuvud- eller servervariabeln för senare användning under Skriv om åtgärd. Läs mer om mönster och insamling.
Omskrivningsåtgärd: Med åtgärdsuppsättningen Skriv om kan du skriva om rubriker (begäran eller svar) eller URL-komponenterna.
En åtgärd kan ha följande värdetyper eller deras kombinationer:
- Text.
- Värdet för begärandehuvudet – Om du vill använda ett värde för den insamlade begäranderubriken anger du syntaxen som
{http_req_headerName}
. - Svarshuvudets värde – Om du vill använda ett insamlat svarshuvudvärde från föregående villkor anger du syntaxen som
{http_resp_headerName}
. Du kan använda{capt_header_value_matcher}
när värdet hämtas från åtgärdsuppsättningens svarshuvud "Set-Cookie". Läs mer om avbildning under Åtgärdsuppsättning. - Servervariabel – Om du vill använda en servervariabel anger du syntaxen som
{var_serverVariable}
. Lista över servervariabler som stöds.
Kommentar
Användning av fältet Matchning av rubrikvärde {capt_header_value_matcher} stöds för närvarande inte via portalen. Därför måste du fortsätta att använda en icke-portalmetod för put-åtgärder om du använder det här fältet.
När du använder en åtgärd för att skriva om en URL stöds följande åtgärder:
- URL-sökväg: Det nya värdet som ska anges som sökväg.
- URL-frågesträng: Det nya värde som frågesträngen måste skrivas om till.
- Utvärdera sökvägskartan igen: Ange om url-sökvägskartan måste utvärderas på nytt efter omskrivningen. 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 igen 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.
Mönstermatchning och insamling
Patten-matchning och insamling stöds under Villkor och åtgärd (under Åtgärd stöds det endast för en specifik rubrik).
Mönstermatchning
Application Gateway använder reguljära uttryck för mönstermatchning. Du bör använda RE2-kompatibla uttryck (Regular Expression 2) när du skriver din mönstermatchningssyntax.
Du kan använda mönstermatchning under både Villkor och Åtgärd.
- Villkor: Detta används för att matcha värdena för en rubrik- eller servervariabel. Om du vill matcha ett mönster under "Villkor" använder du egenskapen "mönster".
- Åtgärd: Mönstermatchning under Åtgärdsuppsättning är endast tillgängligt för svarsrubriken "Set-Cookie". Om du vill matcha ett mönster för Set-Cookie under en åtgärd använder du egenskapen "HeaderValueMatcher". Om värdet registreras kan det användas som {capt_header_value_matcher}. Eftersom det kan finnas flera Set-Cookie kan du med ett mönster som matchar här leta efter en specifik cookie. Exempel: För en viss version av användaragenten vill du skriva om svarshuvudet för set-cookie för "cookie2" med max-age=3600 (en timme). I det här fallet kan du använda
- Villkor – Typ: Begärandehuvud, Rubriknamn: user-agent, Mönster att matcha: *2.0
- Åtgärd – Skriv om typ: Svarsrubrik, Åtgärdstyp: Set, Rubriknamn: Set-Cookie, Rubrikvärde Matcher: cookie2=(.*), Rubrikvärde: cookie2={capt_header_value_matcher_1}; Maxålder=3600
Kommentar
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).
Syntax för insamling
Mönster kan också användas för att avbilda en understräng för senare användning. Placera parenteser runt ett undermönster i regex-definitionen. 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. Du hittar några exempel i den här programmeringsguiden för Perl.
- (\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
När du har hämtat dem kan du använda dem i värdet Åtgärdsuppsättning 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 ett svarshuvud set-cookie som samlas in via egenskapen "HeaderValueMatcher" måste du använda {capt_header_value_matcher_groupNumber}. Till exempel {capt_header_value_matcher_1} eller {capt_header_value_matcher_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
- Användning av/för 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.
- 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 | beskrivning |
---|---|
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 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 är värdvärdet 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 är query_string värdet 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* är request_uri värdet /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. Variabeln refererar till den ursprungliga URL-sökvägen innan någon manipulation. Det här är en del av begärande-URI:n utan argumenten. I begäran http://contoso.com:8080/article.aspx?id=123&title=fabrikam är /article.aspx till exempel värdet uri_path . |
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 | beskrivning |
---|---|
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. |
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å via 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:
Det går inte att skapa en omskrivningsregel för att ta bort värdhuvudet. Om du försöker skapa en omskrivningsregel med åtgärdstypen inställd på att ta bort och huvudet har angetts som värd resulterar det i ett fel.
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 en kombination av url-omskrivningsfunktionen och sökvägsbaserad routning.
Det gör du genom att skapa en omskrivningsuppsättning med ett villkor som söker efter en specifik parameter (frågesträng, sidhuvud osv.) och utför sedan en åtgärd där den ändrar URL-sökvägen (se till att Omvärdera sökvägskartan är aktiverad). Omskrivningsuppsättningen måste sedan associeras till en sökvägsbaserad regel. Den sökvägsbaserade regeln måste innehålla samma URL-sökvägar som anges i omskrivningsuppsättningen och motsvarande serverdelspool.
Därför tillåter omskrivningsuppsättningen användare att söka efter en specifik parameter och tilldela den en ny sökväg, och den sökvägsbaserade regeln gör det möjligt för användare att tilldela serverdelspooler till dessa sökvägar. Så länge som "Omvärdera sökvägskartan" är aktiverad, dirigerar trafik baserat på sökvägen som anges i omskrivningsuppsättningen.
Ett exempel på användningsfall med frågesträngar finns i Dirigera trafik med parameterbaserad sökvägsval i portalen.
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 Portal
Skriv om vanliga fallgropar i konfigurationen
Det är inte tillåtet att aktivera "Omvärdera sökvägskarta" 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 "Reevaluate path map" aktiverat 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 url-omskrivnings- eller värdhuvudomskrivningskonfigurationen på Application Gateway görs WAF-utvärderingen innan sidhuvudomskrivningen (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 huvudomskrivning 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"
.
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. Url:en som användaren ser i webbläsaren uppdateras till den nya URL:en.
Begränsningar
- 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.
- Det går inte att skriva om anslutnings- och uppgraderingshuvuden
- Omskrivningar stöds inte för 4xx- och 5xx-svar som genereras direkt från Application Gateway