Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Warning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .
Important
Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.
För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .
Av Kirk Larkin och Rick Anderson
Den här artikeln introducerar URL-omskrivning med instruktioner om hur du använder URL Rewriting Middleware i ASP.NET Core-program.
URL-omskrivning är en åtgärd för att ändra url:er för begäran baserat på en eller flera fördefinierade regler. URL-omskrivning skapar en abstraktion mellan resursplatser och deras adresser så att platserna och adresserna inte är nära länkade. URL-omskrivning är värdefullt i flera scenarier för att:
- Flytta eller ersätt serverresurser tillfälligt eller permanent och underhåll stabila positionerare för dessa resurser.
- Dela upp bearbetning av begäranden mellan olika appar eller mellan områden i en app.
- Ta bort, lägga till eller omorganisera URL-segment på inkommande begäranden.
- Optimera offentliga URL:er för sökmotoroptimering (SEO).
- Tillåt användning av egna offentliga URL:er för att hjälpa besökare att förutsäga innehållet som returneras genom att begära en resurs.
- Omdirigera osäkra begäranden till säkra slutpunkter.
- Förhindra snabblänkning, där en extern webbplats använder en värdbaserad statisk tillgång på en annan plats genom att länka tillgången till sitt eget innehåll.
URL-omskrivning kan minska prestandan för en app. Begränsa antalet och komplexiteten för regler.
URL-omdirigering och URL-omskrivning
Skillnaden i formulering mellan URL-omdirigering och URL-omskrivning är diskret men har viktiga konsekvenser för att tillhandahålla resurser till klienter. ASP.NET Cores URL Rewriting Middleware kan uppfylla behovet av båda.
En URL-omdirigering omfattar en åtgärd på klientsidan, där klienten instrueras att komma åt en resurs på en annan adress än den klient som ursprungligen begärdes. Detta kräver en tur och retur-resa till servern. Omdirigerings-URL:en som returneras till klienten visas i webbläsarens adressfält när klienten gör en ny begäran för resursen.
Om /resourceomdirigeras till /different-resourcesvarar servern att klienten ska hämta resursen på /different-resource med en statuskod som anger att omdirigeringen antingen är tillfällig eller permanent.
               
              
            
När du omdirigerar begäranden till en annan URL anger du om omdirigeringen är permanent eller tillfällig genom att ange statuskoden med svaret:
- Statuskoden - 301 - Moved Permanentlyanvänds där resursen har en ny, permanent URL och att alla framtida begäranden för resursen ska använda den nya URL:en. Klienten kan cachlagra och återanvända svaret när en 301-statuskod mottas.
- Statuskoden - 302 - Foundanvänds där omdirigeringen är tillfällig eller vanligtvis kan komma att ändras. Statuskoden 302 anger att klienten inte ska lagra URL:en och använda den i framtiden.
Mer information om statuskoder finns i RFC 9110: Definitioner för statuskod.
En URL-omskrivning är en åtgärd på serversidan som tillhandahåller en resurs från en annan resursadress än den begärda klienten. Om du skriver om en URL krävs ingen tur och retur till servern. Den omskrivna URL:en returneras inte till klienten och visas inte i webbläsarens adressfält.
Om /resourceskrivs om till /different-resourcehämtar servern internt och returnerar resursen på /different-resource.
Även om klienten kanske kan hämta resursen på den omskrivna URL:en informeras inte klienten om att resursen finns på den omskrivna URL:en när den gör sin begäran och tar emot svaret.
               
              
            
Exempelapp för URL-omskrivning
Utforska funktionerna i URL-hanteringsmiddleware med exempelappen. Appen tillämpar omdirigerings- och omskrivningsregler och visar den omdirigerade eller omskrivna URL:en för flera scenarier.
När du ska använda URL-omskrivnings-middleware
Använd URL Rewriting Middleware när följande metoder inte är tillfredsställande:
- URL-omskrivningsmodul med IIS på Windows Server
- Apache mod_rewrite-modul på Apache Server
- URL-omskrivning på Nginx
Använd URL-omskrivningsmellanprogrammet när appen är värd på HTTP.sys-server.
De främsta orsakerna till att använda serverbaserade URL-omskrivningstekniker i IIS, Apache och Nginx är:
- Mellanprogrammet stöder inte alla funktioner i dessa moduler. - Vissa av funktionerna i servermodulerna fungerar inte med ASP.NET Core-projekt, till exempel - IsFile-begränsningarna i IIS-omskrivningsmodulen. I dessa scenarier använder du mellanprogrammet i stället.
- Prestandan för mellanprogrammet matchar förmodligen inte modulernas prestanda. - Benchmarking är det enda sättet att med säkerhet veta vilken metod som försämrar prestanda mest eller om försämrad prestanda är försumbar. 
Tillägg och alternativ
Upprätta url-omskrivnings- och omdirigeringsregler genom att skapa en instans av klassen RewriteOptions med tilläggsmetoder för var och en av omskrivningsreglerna. Länka flera regler i den ordning de ska bearbetas. 
              RewriteOptions skickas till URL-omskrivningsmedlaren när det läggs till i begärandepipelinen med UseRewriter:
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
I föregående kod MethodRules är en användardefinierad klass. Mer RewriteRules.cs information finns i den här artikeln.
Omdirigera icke-www till www
Det finns tre alternativ som gör det möjligt för appen att omdirigera icke-www förfrågningar till www:
- AddRedirectToWwwPermanent: Omdirigera begäran permanent till underdomänen - wwwom begäran inte är -- www. Omdirigerar med statuskoden Status308PermanentRedirect .
- AddRedirectToWww: Omdirigera begäran till underdomänen - wwwom den inkommande begäran inte är -- www. Omdirigerar med statuskoden Status307TemporaryRedirect . En överbelastning tillåter att statuskoden för svaret ges. Använd ett fält i StatusCodes klassen för en statuskodtilldelning.
URL omdirigering
Använd AddRedirect för att omdirigera begäranden. Den första parametern innehåller .NET regular expression (Regex) för matchning på sökvägen till den inkommande URL:en. Den andra parametern är ersättningssträngen. Den tredje parametern, om den finns, anger statuskoden. Om statuskoden inte har angetts är statuskoden som standard 302 – Hittades, vilket anger att resursen tillfälligt flyttas eller ersätts.
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
I en webbläsare med utvecklarverktyg aktiverade skickar du en begäran till exempelappen med sökvägen /redirect-rule/1234/5678. Det reguljära uttrycket matchar begärandesökvägen på redirect-rule/(.*)och sökvägen ersätts med /redirected/1234/5678. Omdirigerings-URL:en skickas tillbaka till klienten med statuskoden 302 – Hittade . Webbläsaren gör en ny begäran på omdirigerings-URL:en, som visas i webbläsarens adressfält. Eftersom inga regler i exempelappen matchar på omdirigerings-URL:en:
- Den andra begäran tar emot ett svar på 200 – OK från appen.
- Brödtexten i svaret visar omdirigerings-URL:en.
En tur och retur-resa görs till servern när en URL omdirigeras.
Warning
Var försiktig när du upprättar omdirigeringsregler. Omdirigeringsregler utvärderas för varje begäran till appen, inklusive efter en omdirigering. Det är enkelt att oavsiktligt skapa en loop med oändliga omdirigeringar.
Den del av uttrycket som finns inom parenteser kallas för en avbildningsgrupp. Uttryckets punkt (.) innebär matcha vilket tecken som helst. Asterisken (*) indikerar att föregående tecken matchas noll eller flera gånger. Därför samlas de två sista sökvägssegmenten i URL:en, 1234/5678, in av insamlingsgruppen (.*). Alla värden som anges i begärande-URL:en efter redirect-rule/ registreras av den här enskilda insamlingsgruppen.
I ersättningssträngen infogas fångade grupper i strängen med dollartecknet ($) följt av sekvensnumret för fångsten. Det första fångstgruppens värde hämtas med $1, det andra med $2, och de fortsätter i följd för fångstgrupperna i det reguljära uttrycket. Det finns bara en grupperad grupp i det reguljära uttrycket för omdirigeringsregeln i redirect-rule/(.*), så det finns bara en inmatad grupp i ersättningssträngen, som är $1. När regeln tillämpas blir /redirected/1234/5678URL:en .
Prova /redirect-rule/1234/5678 med webbläsarverktygen på nätverksfliken.
URL-omdirigering till en säker slutpunkt
Använd AddRedirectToHttps för att omdirigera HTTP-begäranden till samma värd och sökväg med hjälp av HTTPS-protokollet. Om statuskoden inte har angetts, används 302 – Funnen som standard av mellanprogrammet. Om porten inte har angetts:
- Mellanprogrammet använder nullsom standard.
- Schemat ändras till https(HTTPS-protokoll) och klienten kommer åt resursen på port 443.
I följande exempel visas hur du anger statuskoden till 301 - Moved Permanently och ändrar porten till DEN HTTPS-port som används av Kestrel localhost. I produktion är HTTPS-porten inställd på null:
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
int? localhostHTTPSport = null;
if (app.Environment.IsDevelopment())
{
    localhostHTTPSport = Int32.Parse(Environment.GetEnvironmentVariable(
                   "ASPNETCORE_URLS")!.Split(new Char[] { ':', ';' })[2]);
}
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        // localhostHTTPport not needed for production, used only with localhost.
        .AddRedirectToHttps(301, localhostHTTPSport)
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
Använd AddRedirectToHttpsPermanent för att omdirigera osäkra begäranden till samma värd och sökväg med säkert HTTPS-protokoll på port 443. Mellanprogrammet anger statuskoden till 301 - Moved Permanently.
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
Note
När du omdirigerar till en säker slutpunkt utan krav på ytterligare omdirigeringsregler rekommenderar vi att du använder HTTPS Redirection Middleware. Mer information finns i Framtvinga HTTPS.
Exempelappen visar hur du använder AddRedirectToHttps eller AddRedirectToHttpsPermanent. Gör en osäker HTTP-begäran till appen på http://redirect6.azurewebsites.net/iis-rules-rewrite/xyz. När du testar HTTP till HTTPS-omdirigering med localhost:
- Använd HTTP-URL:en, som har en annan port än HTTPS-URL:en. HTTP-URL:en finns i Properties/launchSettings.jsonfilen.
- Det går inte att ta bort sfrånhttps://localhost/{port}eftersom localhost inte svarar när HTTP-anrop görs till HTTPS-porten.
Följande bild visar en bild från F12-webbläsarverktyget av en begäran till http://redirect6.azurewebsites.net/iis-rules-rewrite/xyz med användning av den föregående koden.
               
              
            
URL rewrite
Använd AddRewrite för att skapa en regel för att skriva om URL:er. Den första parametern innehåller det reguljära uttrycket för matchning på den inkommande URL-sökvägen. Den andra parametern är ersättningssträngen. Den tredje parametern, skipRemainingRules: {true|false}, anger för mellanprogrammet om du vill hoppa över ytterligare omskrivningsregler om den aktuella regeln tillämpas.
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
Prova förfrågan till https://redirect6.azurewebsites.net/rewrite-rule/1234/5678
Caret (^) i början av uttrycket innebär att matchningen börjar i början av URL-sökvägen.
I det tidigare exemplet med omdirigeringsregeln redirect-rule/(.*)finns det ingen caret (^) i början av det reguljära uttrycket. Därför kan alla tecken följa redirect-rule/ i sökvägen för en lyckad matchning.
| Path | Match | 
|---|---|
| /redirect-rule/1234/5678 | Yes | 
| /my-cool-redirect-rule/1234/5678 | Yes | 
| /anotherredirect-rule/1234/5678 | Yes | 
Omskrivningsregeln, ^rewrite-rule/(\d+)/(\d+), matchar bara sökvägar om de börjar med rewrite-rule/. Observera skillnaden i matchning i följande tabell.
| Path | Match | 
|---|---|
| /rewrite-rule/1234/5678 | Yes | 
| /my-cool-rewrite-rule/1234/5678 | No | 
| /anotherrewrite-rule/1234/5678 | No | 
Efter ^rewrite-rule/-delen av uttrycket finns det två fångstgrupper, (\d+)/(\d+). Tecknen \dmatchar en siffra (tal). Plustecknet (+) innebär att matcha ett eller flera av föregående tecken. Url:en måste därför innehålla ett tal följt av ett snedstreck följt av ett annat tal. Dessa fångstgrupper matas in i den omskrivna URL:en som $1 och $2. Omskrivningsregelns ersättningssträng placerar de insamlade grupperna i frågesträngen. Den begärda sökvägen /rewrite-rule/1234/5678 skrivs om för att returnera resursen på /rewritten?var1=1234&var2=5678. Om en frågesträng finns på den ursprungliga begäran bevaras den när URL:en skrivs om.
Det finns ingen tur och retur till servern för att returnera resursen. Om resursen finns hämtas den och returneras till klienten med statuskoden 200 – OK . Eftersom klienten inte omdirigeras ändras inte URL:en i webbläsarens adressfält. Klienter kan inte identifiera att en URL-omskrivningsåtgärd har inträffat på servern.
Prestandatips för url-omskrivning och omdirigering
För det snabbaste svaret:
- Ordna omskrivningsregler från den regel som oftast matchas till den som matchas minst ofta.
- Använd skipRemainingRules: truenär det är möjligt eftersom matchningsregler är beräkningsmässigt dyra och ökar appens svarstid. Hoppa över bearbetningen av de återstående reglerna när en matchning sker och ingen ytterligare regelbearbetning krävs.
Warning
En angripare kan tillhandahålla resurskrävande indata till RegularExpressions och orsaka en Denial-of-Service-attack. ASP.NET Core framework-API:er som använder RegularExpressions införa en timeout. Till exempel använder Regex-timeouten (_regexTimeout) för både RedirectRule klassen och RewriteRule klasserna en timeout på en sekund.
Note
Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik version använder du listrutan Välj bland grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).
Apache mod_rewrite
Tillämpa Apache mod_rewrite-regler med AddApacheModRewrite. Kontrollera att regelfilen har distribuerats med appen. Mer information och exempel på mod_rewrite regler finns i Apache mod_rewrite.
A StreamReader används för att läsa reglerna från ApacheModRewrite.txt-regelfilen :
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
Exempelappen omdirigerar begäranden från /apache-mod-rules-redirect/(.\*) till /redirected?id=$1. Svarsstatuskoden är 302 – Hittades.
# Rewrite path with additional sub directory
RewriteRule ^/apache-mod-rules-redirect/(.*) /redirected?id=$1 [L,R=302]
Prova förfrågan till https://redirect6.azurewebsites.net/apache-mod-rules-redirect/1234
Apache-mellanprogrammet stöder följande Apache mod_rewrite-servervariabler:
- CONN_REMOTE_ADDR
- HTTP_ACCEPT
- HTTP_CONNECTION
- HTTP_COOKIE
- HTTP_FORWARDED
- HTTP_HOST
- HTTP_REFERER
- HTTP_USER_AGENT
- HTTPS
- IPV6
- QUERY_STRING
- REMOTE_ADDR
- REMOTE_PORT
- REQUEST_FILENAME
- REQUEST_METHOD
- REQUEST_SCHEME
- REQUEST_URI
- SCRIPT_FILENAME
- SERVER_ADDR
- SERVER_PORT
- SERVER_PROTOCOL
- TIME
- TIME_DAY
- TIME_HOUR
- TIME_MIN
- TIME_MON
- TIME_SEC
- TIME_WDAY
- TIME_YEAR
Note
Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik version använder du listrutan Välj bland grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).
Omskrivningsmodulregler för IIS-URL
Om du vill använda samma regeluppsättning som gäller för IIS URL Rewrite Module använder du AddIISUrlRewrite. Kontrollera att regelfilen har distribuerats med appen. Dirigera inte mellanprogrammet att använda appens web.config-fil när den körs på Windows Server IIS. Med IIS bör dessa regler lagras utanför appens web.config-fil för att undvika konflikter med IIS-omskrivningsmodulen. Mer information och exempel på regler för omskrivning av IIS-URL-modul finns i Använda url-omskrivningsmodul 2.0 och konfigurationsreferens för URL-omskrivningsmodul.
A StreamReader används för att läsa reglerna från IISUrlRewrite.xml regelfilen:
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
Exempelappen skriver om begäranden från /iis-rules-rewrite/(.*) till /rewritten?id=$1. Svaret skickas till klienten med statuskoden 200 – OK .
<rewrite>
  <rules>
    <rule name="Rewrite segment to id querystring" stopProcessing="true">
      <match url="^iis-rules-rewrite/(.*)$" />
      <action type="Rewrite" url="rewritten?id={R:1}" appendQueryString="false"/>
    </rule>
  </rules>
</rewrite>
Prova förfrågan till https://redirect6.azurewebsites.net/iis-rules-rewrite/xyz
Appar som har en aktiv IIS-omskrivningsmodul med regler på servernivå konfigurerade som påverkar appen på oönskade sätt:
- Överväg att inaktivera IIS-omskrivningsmodulen för appen.
- Mer information finns i Inaktivera IIS-moduler.
Funktioner som inte stöds
Mellanprogrammet stöder inte följande funktioner för omskrivning av IIS-URL-modul:
- Regler för utgående trafik
- Anpassade servervariabler
- Wildcards
- LogRewrittenUrl
Servervariabler som stöds
Mellanprogrammet stöder följande IIS URL Rewrite Module-servervariabler:
- CONTENT_LENGTH
- CONTENT_TYPE
- HTTP_ACCEPT
- HTTP_CONNECTION
- HTTP_COOKIE
- HTTP_HOST
- HTTP_REFERER
- HTTP_URL
- HTTP_USER_AGENT
- HTTPS
- LOCAL_ADDR
- QUERY_STRING
- REMOTE_ADDR
- REMOTE_PORT
- REQUEST_FILENAME
- REQUEST_URI
Note
Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik version använder du listrutan Välj bland grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).
IFileProvider kan erhållas via en PhysicalFileProvider. Den här metoden kan ge större flexibilitet för placeringen av filer med omskrivningsregler. Kontrollera att filerna för omskrivningsregler distribueras till servern på den sökväg som anges.
var fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());
Metodbaserad regel
Använd Add för att implementera anpassad regellogik i en metod. 
              Add exponerar RewriteContext, vilket gör HttpContext tillgängligt för användning i omdirigeringsmetoder. Egenskapen RewriteContext.Result avgör hur ytterligare pipelinebearbetning hanteras. Ange värdet till ett av fälten RuleResult som beskrivs i följande tabell.
| Skriv om kontextresultat | Action | 
|---|---|
| RuleResult.ContinueRules(standardinställning) | Fortsätt att tillämpa regler. | 
| RuleResult.EndResponse | Sluta tillämpa regler och skicka svaret. | 
| RuleResult.SkipRemainingRules | Sluta tillämpa regler och skicka kontexten till nästa mellanprogram. | 
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
Exempelappen visar en metod som omdirigerar begäranden för sökvägar som slutar med .xml. När en begäran görs för /file.xml:
- Begäran omdirigeras till /xmlfiles/file.xml
- Statuskoden är inställd på 301 - Moved Permanently. När webbläsaren gör en ny begäran för/xmlfiles/file.xml, levererar Static File Middleware filen till klienten från mappen wwwroot/xmlfiles. För en omdirigering anger du uttryckligen statuskoden för svaret. Annars returneras statuskoden 200 – OK och omdirigeringen sker inte på klienten.
              RewriteRules.cs:
public static void RedirectXmlFileRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;
    // Because the client is redirecting back to the same app, stop 
    // processing if the request has already been redirected.
    if (request.Path.StartsWithSegments(new PathString("/xmlfiles")) ||
        request.Path.Value==null)
    {
        return;
    }
    if (request.Path.Value.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
    {
        var response = context.HttpContext.Response;
        response.StatusCode = (int) HttpStatusCode.MovedPermanently;
        context.Result = RuleResult.EndResponse;
        response.Headers[HeaderNames.Location] = 
            "/xmlfiles" + request.Path + request.QueryString;
    }
}
Den här metoden kan också skriva om begäranden. Exempelappen visar hur du skriver om sökvägen för en textfilbegäran så att filen file.txt från mappen wwwroot kan tjäna. Static File Middleware hanterar filen baserat på den uppdaterade sökvägen för begäran:
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
              RewriteRules.cs:
public static void RewriteTextFileRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;
    if (request.Path.Value != null &&
        request.Path.Value.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
    {
        context.Result = RuleResult.SkipRemainingRules;
        request.Path = "/file.txt";
    }
}
IRule-baserad regel
Använd Add för att använda regellogik i en klass som implementerar IRule gränssnittet. 
              IRule ger större flexibilitet jämfört med metodbaserad regelmetod. Implementeringsklassen kan innehålla en konstruktor som tillåter att parametrar överförs till ApplyRule-metoden.
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
Värdena för parametrarna i exempelappen kontrolleras för extension och newPath för att uppfylla flera villkor. 
              extension Måste innehålla ett värde och värdet måste vara .png, .jpgeller .gif. Om det newPath inte är giltigt utlöses en ArgumentException . Om en begäran görs för image.pngomdirigeras begäran till /png-images/image.png. Om en begäran görs för image.jpgomdirigeras begäran till /jpg-images/image.jpg. Statuskoden är inställd på 301 - Moved Permanently, och context.Result är inställd på att sluta bearbeta regler och skicka svaret.
public class RedirectImageRequests : IRule
{
    private readonly string _extension;
    private readonly PathString _newPath;
    public RedirectImageRequests(string extension, string newPath)
    {
        if (string.IsNullOrEmpty(extension))
        {
            throw new ArgumentException(nameof(extension));
        }
        if (!Regex.IsMatch(extension, @"^\.(png|jpg|gif)$"))
        {
            throw new ArgumentException("Invalid extension", nameof(extension));
        }
        if (!Regex.IsMatch(newPath, @"(/[A-Za-z0-9]+)+?"))
        {
            throw new ArgumentException("Invalid path", nameof(newPath));
        }
        _extension = extension;
        _newPath = new PathString(newPath);
    }
    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;
        // Because we're redirecting back to the same app, stop 
        // processing if the request has already been redirected
        if (request.Path.StartsWithSegments(new PathString(_newPath)) ||
            request.Path.Value == null)
        {
            return;
        }
        if (request.Path.Value.EndsWith(_extension, StringComparison.OrdinalIgnoreCase))
        {
            var response = context.HttpContext.Response;
            response.StatusCode = (int) HttpStatusCode.MovedPermanently;
            context.Result = RuleResult.EndResponse;
            response.Headers[HeaderNames.Location] = 
                _newPath + request.Path + request.QueryString;
        }
    }
}
Try:
- PNG-begäran: https://redirect6.azurewebsites.net/image.png
- JPG-begäran: https://redirect6.azurewebsites.net/image.jpg
Regex-exempel
| Goal | Regex-sträng & Matchningsexempel | Ersättningssträng & Utdataexempel | 
|---|---|---|
| Skriv om sökvägen till querystring | ^path/(.*)/(.*)/path/abc/123 | path?var1=$1&var2=$2/path?var1=abc&var2=123 | 
| Ta bort avslutande snedstreck | ^path2/(.*)/$/path2/xyz/ | $1/path2/xyz | 
| Framtvinga avslutande snedstreck | ^path3/(.*[^/])$/path3/xyz | $1//path3/xyz/ | 
| Undvik att skriva om specifika begäranden | ^(.*)(?<!\.axd)$eller^(?!.*\.axd$)(.*)$Ja: /path4/resource.htmNej: /path4/resource.axd | rewritten/$1/rewritten/resource.htm/resource.axd | 
| Ordna om URL-segment | path5/(.*)/(.*)/(.*)path5/1/2/3 | path5/$3/$2/$1path5/3/2/1 | 
| Ersätt ett URL-segment | ^path6/(.*)/segment2/(.*)^path6/segment1/segment2/segment3 | path6/$1/replaced/$2/path6/segment1/replaced/segment3 | 
Länkarna i föregående tabell använder följande kod som distribuerats till Azure:
using Microsoft.AspNetCore.Rewrite;
using RewriteRules;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
using (StreamReader apacheModRewriteStreamReader =
    File.OpenText("ApacheModRewrite.txt"))
using (StreamReader iisUrlRewriteStreamReader =
    File.OpenText("IISUrlRewrite.xml"))
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent()
        .AddRedirect("redirect-rule/(.*)", "redirected/$1")
        .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2",
            skipRemainingRules: true)
        // Rewrite path to QS.
        .AddRewrite(@"^path/(.*)/(.*)", "path?var1=$1&var2=$2",
            skipRemainingRules: true)
        // Skip trailing slash.
        .AddRewrite(@"^path2/(.*)/$", "path2/$1",
            skipRemainingRules: true)
         // Enforce trailing slash.
         .AddRewrite(@"^path3/(.*[^/])$", "path3/$1/",
            skipRemainingRules: true)
         // Avoid rewriting specific requests.
         .AddRewrite(@"^path4/(.*)(?<!\.axd)$", "rewritten/$1",
            skipRemainingRules: true)
         // Rearrange URL segments
         .AddRewrite(@"^path5/(.*)/(.*)/(.*)", "path5/$3/$2/$1",
            skipRemainingRules: true)
          // Replace a URL segment
          .AddRewrite(@"^path6/(.*)/segment2/(.*)", "path6/$1/replaced/$2",
            skipRemainingRules: true)
        .AddApacheModRewrite(apacheModRewriteStreamReader)
        .AddIISUrlRewrite(iisUrlRewriteStreamReader)
        .Add(MethodRules.RedirectXmlFileRequests)
        .Add(MethodRules.RewriteTextFileRequests)
        .Add(new RedirectImageRequests(".png", "/png-images"))
        .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
    app.UseRewriter(options);
}
app.UseStaticFiles();
app.Run(context => context.Response.WriteAsync(
    $"Rewritten or Redirected Url: " +
    $"{context.Request.Path + context.Request.QueryString}"));
app.Run();
I de flesta exempel på reguljära uttryck används literalen path för att göra unika testbara omskrivningsregler för det använda exemplet. Normalt skulle det reguljära uttrycket inte innehålla path. Se till exempel tabellen med reguljära uttrycksexempel .
Det här dokumentet introducerar URL-omskrivning och ger instruktioner om hur du använder URL-omskrivningsmiddleware i ASP.NET Core-applikationer.
URL-omskrivning är en åtgärd för att ändra url:er för begäran baserat på en eller flera fördefinierade regler. URL-omskrivning skapar en abstraktion mellan resursplatser och deras adresser så att platserna och adresserna inte är nära länkade. URL-omskrivning är värdefullt i flera scenarier för att:
- Flytta eller ersätt serverresurser tillfälligt eller permanent och underhåll stabila positionerare för dessa resurser.
- Dela upp bearbetning av begäranden mellan olika appar eller mellan områden i en app.
- Ta bort, lägga till eller omorganisera URL-segment på inkommande begäranden.
- Optimera offentliga URL:er för sökmotoroptimering (SEO).
- Tillåt användning av egna offentliga URL:er för att hjälpa besökare att förutsäga innehållet som returneras genom att begära en resurs.
- Omdirigera osäkra begäranden till säkra slutpunkter.
- Förhindra snabblänkning, där en extern webbplats använder en värdbaserad statisk tillgång på en annan plats genom att länka tillgången till sitt eget innehåll.
Note
URL-omskrivning kan minska prestandan för en app. När det är möjligt begränsar du antalet och komplexiteten i reglerna.
Visa eller ladda ned exempelkod (hur du laddar ned)
URL-omdirigering och URL-omskrivning
Skillnaden i formulering mellan URL-omdirigering och URL-omskrivning är diskret men har viktiga konsekvenser för att tillhandahålla resurser till klienter. ASP.NET Cores URL Rewriting Middleware kan uppfylla behovet av båda.
En URL-omdirigering omfattar en åtgärd på klientsidan, där klienten instrueras att komma åt en resurs på en annan adress än den klient som ursprungligen begärdes. Detta kräver en tur och retur-resa till servern. Omdirigerings-URL:en som returneras till klienten visas i webbläsarens adressfält när klienten gör en ny begäran för resursen.
Om /resourceomdirigeras till /different-resourcesvarar servern att klienten ska hämta resursen på /different-resource med en statuskod som anger att omdirigeringen antingen är tillfällig eller permanent.
               
              
            
När du omdirigerar begäranden till en annan URL anger du om omdirigeringen är permanent eller tillfällig genom att ange statuskoden med svaret:
- Statuskoden - 301 - Moved Permanentlyanvänds där resursen har en ny, permanent URL och du vill instruera klienten att alla framtida begäranden för resursen ska använda den nya URL:en. Klienten kan cachlagra och återanvända svaret när en 301-statuskod mottas.
- Statuskoden 302 – Found används där omdirigeringen är tillfällig eller vanligtvis kan komma att ändras. Statuskoden 302 anger att klienten inte ska lagra URL:en och använda den i framtiden. 
Mer information om statuskoder finns i RFC 9110: Definitioner för statuskod.
En URL-omskrivning är en åtgärd på serversidan som tillhandahåller en resurs från en annan resursadress än den begärda klienten. Om du skriver om en URL krävs ingen tur och retur till servern. Den omskrivna URL:en returneras inte till klienten och visas inte i webbläsarens adressfält.
Om /resourceskrivs om till /different-resourcehämtar servern internt och returnerar resursen på /different-resource.
Även om klienten kanske kan hämta resursen på den omskrivna URL:en informeras inte klienten om att resursen finns på den omskrivna URL:en när den gör sin begäran och tar emot svaret.
               
              
            
Exempelapp för URL-omskrivning
Du kan utforska funktionerna i URL Rewriting Middleware med exempelappen. Appen tillämpar omdirigerings- och omskrivningsregler och visar den omdirigerade eller omskrivna URL:en för flera scenarier.
När du ska använda URL-omskrivnings-middleware
Använd URL Rewriting Middleware när du inte kan använda följande metoder:
- URL-omskrivningsmodul med IIS på Windows Server
- Apache mod_rewrite-modul på Apache Server
- URL-omskrivning på Nginx
Använd URL-omskrivningsmellanprogrammet när appen är värd på HTTP.sys-server.
De främsta orsakerna till att använda serverbaserade URL-omskrivningstekniker i IIS, Apache och Nginx är:
- Mellanprogrammet stöder inte alla funktioner i dessa moduler. - Vissa av funktionerna i servermodulerna fungerar inte med ASP.NET Core-projekt, till exempel - IsFile-begränsningarna i IIS-omskrivningsmodulen. I dessa scenarier använder du mellanprogrammet i stället.
- Prestandan för mellanprogrammet matchar förmodligen inte modulernas prestanda. - Benchmarking är det enda sättet att veta säkert vilken metod som försämrar prestanda mest eller om försämrad prestanda är försumbar. 
Package
URL Rewriting Middleware tillhandahålls av paketet Microsoft.AspNetCore.Rewrite , som implicit ingår i ASP.NET Core-appar.
Tillägg och alternativ
Upprätta url-omskrivnings- och omdirigeringsregler genom att skapa en instans av klassen RewriteOptions med tilläggsmetoder för var och en av dina omskrivningsregler. Länka flera regler i den ordning som du vill att de ska bearbetas. 
              RewriteOptions skickas till URL-omskrivningsmedlaren när det läggs till i begärandepipelinen med UseRewriter:
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Omdirigera icke-www till www
Det finns tre alternativ som gör det möjligt för appen att omdirigera icke-www förfrågningar till www:
- AddRedirectToWwwPermanent: Omdirigera begäran permanent till underdomänen - wwwom begäran inte är -- www. Omdirigerar med statuskoden Status308PermanentRedirect .
- AddRedirectToWww: Omdirigera begäran till underdomänen - wwwom den inkommande begäran inte är -- www. Omdirigerar med statuskoden Status307TemporaryRedirect . Genom en överbelastning kan du ange statuskoden för svaret. Använd ett fält i StatusCodes klassen för en statuskodtilldelning.
URL omdirigering
Använd AddRedirect för att omdirigera begäranden. Den första parametern innehåller din Regex för matchning på sökvägen till den inkommande URL:en. Den andra parametern är ersättningssträngen. Den tredje parametern, om den finns, anger statuskoden. Om du inte anger statuskoden är statuskoden som standard 302 – Hittades, vilket indikerar att resursen tillfälligt flyttas eller ersätts.
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
I en webbläsare med utvecklarverktyg aktiverade skickar du en begäran till exempelappen med sökvägen /redirect-rule/1234/5678. Regex matchar begärandesökvägen på redirect-rule/(.*)och sökvägen ersätts med /redirected/1234/5678. Omdirigerings-URL:en skickas tillbaka till klienten med statuskoden 302 – Hittade . Webbläsaren gör en ny begäran på omdirigerings-URL:en, som visas i webbläsarens adressfält. Eftersom inga regler i exempelappen matchar på omdirigerings-URL:en:
- Den andra begäran tar emot ett svar på 200 – OK från appen.
- Brödtexten i svaret visar omdirigerings-URL:en.
En tur och retur-resa görs till servern när en URL omdirigeras.
Warning
Var försiktig när du upprättar omdirigeringsregler. Omdirigeringsregler utvärderas för varje begäran till appen, inklusive efter en omdirigering. Det är enkelt att oavsiktligt skapa en loop med oändliga omdirigeringar.
Ursprunglig begäran: /redirect-rule/1234/5678
               
              
            
Den del av uttrycket som finns inom parenteser kallas för en avbildningsgrupp. Uttryckets punkt (.) innebär matcha vilket tecken som helst. Asterisken (*) indikerar att föregående tecken matchas noll eller flera gånger. Därför samlas de två sista sökvägssegmenten i URL:en, 1234/5678, in av insamlingsgruppen (.*). Alla värden som du anger i begärande-URL:en efter redirect-rule/ registreras av den här enskilda insamlingsgruppen.
I ersättningssträngen infogas fångade grupper i strängen med dollartecknet ($) följt av sekvensnumret för fångsten. Det första fångstgruppens värde hämtas med $1, det andra med $2, och de fortsätter i följd för fångstgrupperna i din regex. Det finns bara en grupperad grupp i regex för omdirigeringsregeln i exempelappen, så det finns bara en inmatad grupp i ersättningssträngen, som är $1. När regeln tillämpas blir /redirected/1234/5678URL:en .
URL-omdirigering till en säker slutpunkt
Använd AddRedirectToHttps för att omdirigera HTTP-begäranden till samma värd och sökväg med hjälp av HTTPS-protokollet. Om statuskoden inte har angetts, används 302 – Funnen som standard av mellanprogrammet. Om porten inte har angetts:
- Mellanprogrammet använder nullsom standard.
- Schemat ändras till https(HTTPS-protokoll) och klienten kommer åt resursen på port 443.
I följande exempel visas hur du anger statuskoden till 301 - Moved Permanently och ändrar porten till 5001.
public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirectToHttps(301, 5001);
    app.UseRewriter(options);
}
Använd AddRedirectToHttpsPermanent för att omdirigera osäkra begäranden till samma värd och sökväg med säkert HTTPS-protokoll på port 443. Mellanprogrammet anger statuskoden till 301 - Moved Permanently.
public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent();
    app.UseRewriter(options);
}
Note
När du omdirigerar till en säker slutpunkt utan krav på ytterligare omdirigeringsregler rekommenderar vi att du använder HTTPS Redirection Middleware. Mer information finns i avsnittet Framtvinga HTTPS .
Exempelappen kan visa hur du använder AddRedirectToHttps eller AddRedirectToHttpsPermanent. Lägg till tilläggsmetoden i RewriteOptions. Gör en osäker begäran till appen på valfri URL. Stäng webbläsarens säkerhetsvarning om att det självsignerade certifikatet inte är betrott eller skapa ett undantag för att lita på certifikatet.
Ursprunglig begäran med AddRedirectToHttps(301, 5001):http://localhost:5000/secure
               
              
            
Ursprunglig begäran med AddRedirectToHttpsPermanent:http://localhost:5000/secure
               
              
            
URL rewrite
Använd AddRewrite för att skapa en regel för att skriva om URL:er. Den första parametern innehåller regex för matchning på den inkommande URL-sökvägen. Den andra parametern är ersättningssträngen. Den tredje parametern, skipRemainingRules: {true|false}, anger för mellanprogrammet om du vill hoppa över ytterligare omskrivningsregler om den aktuella regeln tillämpas.
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Ursprunglig begäran: /rewrite-rule/1234/5678
               
              
            
Careten (^) i början av uttrycket innebär att matchningen börjar i början av URL-sökvägen.
I det tidigare exemplet med omdirigeringsregeln redirect-rule/(.*)finns det ingen karat (^) i början av regex. Därför kan alla tecken följa redirect-rule/ i sökvägen för en lyckad matchning.
| Path | Match | 
|---|---|
| /redirect-rule/1234/5678 | Yes | 
| /my-cool-redirect-rule/1234/5678 | Yes | 
| /anotherredirect-rule/1234/5678 | Yes | 
Omskrivningsregeln, ^rewrite-rule/(\d+)/(\d+), matchar bara sökvägar om de börjar med rewrite-rule/. Observera skillnaden i matchning i följande tabell.
| Path | Match | 
|---|---|
| /rewrite-rule/1234/5678 | Yes | 
| /my-cool-rewrite-rule/1234/5678 | No | 
| /anotherrewrite-rule/1234/5678 | No | 
Efter ^rewrite-rule/-delen av uttrycket finns det två fångstgrupper, (\d+)/(\d+). Tecknen \dmatchar en siffra (tal). Plustecknet (+) innebär att matcha ett eller flera av föregående tecken. Url:en måste därför innehålla ett tal följt av ett snedstreck följt av ett annat tal. Dessa fångstgrupper matas in i den omskrivna URL:en som $1 och $2. Omskrivningsregelns ersättningssträng placerar de insamlade grupperna i frågesträngen. Den begärda sökvägen /rewrite-rule/1234/5678 ändras för att hämta resursen på /rewritten?var1=1234&var2=5678. Om en frågesträng finns på den ursprungliga begäran bevaras den när URL:en skrivs om.
Det finns ingen tur och retur-resa till servern för att hämta resursen. Om resursen finns hämtas den och returneras till klienten med statuskoden 200 – OK . Eftersom klienten inte omdirigeras ändras inte URL:en i webbläsarens adressfält. Klienter kan inte identifiera att en URL-omskrivningsåtgärd har inträffat på servern.
Note
Använd skipRemainingRules: true när det är möjligt eftersom matchningsregler är beräkningsmässigt dyra och ökar appens svarstid. För det snabbaste appsvaret:
- Ordna omskrivningsregler från den regel som oftast matchas till den som matchas minst ofta.
- Hoppa över bearbetningen av de återstående reglerna när en matchning sker och ingen ytterligare regelbearbetning krävs.
Apache mod_rewrite
Tillämpa Apache mod_rewrite-regler med AddApacheModRewrite. Kontrollera att regelfilen har distribuerats med appen. Mer information och exempel på mod_rewrite regler finns i Apache mod_rewrite.
A StreamReader används för att läsa reglerna från ApacheModRewrite.txt-regelfilen :
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Exempelappen omdirigerar begäranden från /apache-mod-rules-redirect/(.\*) till /redirected?id=$1. Svarsstatuskoden är 302 – Hittades.
# Rewrite path with additional sub directory
RewriteRule ^/apache-mod-rules-redirect/(.*) /redirected?id=$1 [L,R=302]
Ursprunglig begäran: /apache-mod-rules-redirect/1234
               
              
            
Mellanprogrammet stöder följande Apache mod_rewrite-servervariabler:
- CONN_REMOTE_ADDR
- HTTP_ACCEPT
- HTTP_CONNECTION
- HTTP_COOKIE
- HTTP_FORWARDED
- HTTP_HOST
- HTTP_REFERER
- HTTP_USER_AGENT
- HTTPS
- IPV6
- QUERY_STRING
- REMOTE_ADDR
- REMOTE_PORT
- REQUEST_FILENAME
- REQUEST_METHOD
- REQUEST_SCHEME
- REQUEST_URI
- SCRIPT_FILENAME
- SERVER_ADDR
- SERVER_PORT
- SERVER_PROTOCOL
- TIME
- TIME_DAY
- TIME_HOUR
- TIME_MIN
- TIME_MON
- TIME_SEC
- TIME_WDAY
- TIME_YEAR
Omskrivningsmodulregler för IIS-URL
Om du vill använda samma regeluppsättning som gäller för IIS URL Rewrite Module använder du AddIISUrlRewrite. Kontrollera att regelfilen har distribuerats med appen. Dirigera inte mellanprogrammet att använda appens web.config-fil när den körs på Windows Server IIS. Med IIS bör dessa regler lagras utanför appens web.config-fil för att undvika konflikter med IIS-omskrivningsmodulen. Mer information och exempel på regler för omskrivning av IIS-URL-modul finns i Använda url-omskrivningsmodul 2.0 och konfigurationsreferens för URL-omskrivningsmodul.
A StreamReader används för att läsa reglerna från IISUrlRewrite.xml regelfilen:
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Exempelappen skriver om begäranden från /iis-rules-rewrite/(.*) till /rewritten?id=$1. Svaret skickas till klienten med statuskoden 200 – OK .
<rewrite>
  <rules>
    <rule name="Rewrite segment to id querystring" stopProcessing="true">
      <match url="^iis-rules-rewrite/(.*)$" />
      <action type="Rewrite" url="rewritten?id={R:1}" appendQueryString="false"/>
    </rule>
  </rules>
</rewrite>
Ursprunglig begäran: /iis-rules-rewrite/1234
               
              
            
Om du har en aktiv IIS-omskrivningsmodul med regler på servernivå konfigurerade som skulle påverka appen på oönskade sätt kan du inaktivera IIS-omskrivningsmodulen för en app. Mer information finns i Inaktivera IIS-moduler.
Funktioner som inte stöds
Mellanprogrammet stöder inte följande funktioner för omskrivning av IIS-URL-modul:
- Regler för utgående trafik
- Anpassade servervariabler
- Wildcards
- LogRewrittenUrl
Servervariabler som stöds
Mellanprogrammet stöder följande IIS URL Rewrite Module-servervariabler:
- CONTENT_LENGTH
- CONTENT_TYPE
- HTTP_ACCEPT
- HTTP_CONNECTION
- HTTP_COOKIE
- HTTP_HOST
- HTTP_REFERER
- HTTP_URL
- HTTP_USER_AGENT
- HTTPS
- LOCAL_ADDR
- QUERY_STRING
- REMOTE_ADDR
- REMOTE_PORT
- REQUEST_FILENAME
- REQUEST_URI
Note
Du kan också hämta en IFileProvider via en PhysicalFileProvider. Den här metoden kan ge större flexibilitet för platserna för dina omskrivningsreglerfiler. Kontrollera att filerna för omskrivningsregler distribueras till servern på den sökväg som du anger.
PhysicalFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());
Metodbaserad regel
Använd Add för att implementera din egen regellogik i en metod. 
              Add exponerar RewriteContext, vilket gör HttpContext tillgänglig för användning i din metod. 
              RewriteContext.Result avgör hur ytterligare pipelinebearbetning hanteras. Ange värdet till ett av fälten RuleResult som beskrivs i följande tabell.
| Skriv om kontextresultat | Action | 
|---|---|
| RuleResult.ContinueRules(standardinställning) | Fortsätt att tillämpa regler. | 
| RuleResult.EndResponse | Sluta tillämpa regler och skicka svaret. | 
| RuleResult.SkipRemainingRules | Sluta tillämpa regler och skicka kontexten till nästa mellanprogram. | 
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Exempelappen visar en metod som omdirigerar begäranden för sökvägar som slutar med .xml. Om en begäran görs för /file.xmlomdirigeras begäran till /xmlfiles/file.xml. Statuskoden är inställd på 301 - Moved Permanently. När webbläsaren gör en ny begäran för /xmlfiles/file.xml, levererar Static File Middleware filen till klienten från mappen wwwroot/xmlfiles. För en omdirigering anger du uttryckligen statuskoden för svaret. Annars returneras statuskoden 200 – OK och omdirigeringen sker inte på klienten.
              RewriteRules.cs:
public static void RedirectXmlFileRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;
    // Because the client is redirecting back to the same app, stop 
    // processing if the request has already been redirected.
    if (request.Path.StartsWithSegments(new PathString("/xmlfiles")))
    {
        return;
    }
    if (request.Path.Value.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
    {
        var response = context.HttpContext.Response;
        response.StatusCode = (int) HttpStatusCode.MovedPermanently;
        context.Result = RuleResult.EndResponse;
        response.Headers[HeaderNames.Location] = 
            "/xmlfiles" + request.Path + request.QueryString;
    }
}
Den här metoden kan också skriva om begäranden. Exempelappen visar hur du skriver om sökvägen för en textfilbegäran så att filen file.txt från mappen wwwroot kan tjäna. Static File Middleware hanterar filen baserat på den uppdaterade sökvägen för begäran:
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
              RewriteRules.cs:
public static void RewriteTextFileRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;
    if (request.Path.Value.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
    {
        context.Result = RuleResult.SkipRemainingRules;
        request.Path = "/file.txt";
    }
}
IRule-baserad regel
Använd Add för att använda regellogik i en klass som implementerar IRule gränssnittet. 
              IRule ger större flexibilitet jämfört med metodbaserad regelmetod. Implementeringsklassen kan innehålla en konstruktor som gör att du kan skicka in parametrar för ApplyRule metoden.
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Värdena för parametrarna i exempelappen kontrolleras för extension och newPath för att uppfylla flera villkor. 
              extension Måste innehålla ett värde och värdet måste vara .png, .jpgeller .gif. Om det newPath inte är giltigt utlöses en ArgumentException . Om en begäran görs för image.pngomdirigeras begäran till /png-images/image.png. Om en begäran görs för image.jpgomdirigeras begäran till /jpg-images/image.jpg. Statuskoden är inställd på 301 - Moved Permanently, och context.Result är inställd på att sluta bearbeta regler och skicka svaret.
public class RedirectImageRequests : IRule
{
    private readonly string _extension;
    private readonly PathString _newPath;
    public RedirectImageRequests(string extension, string newPath)
    {
        if (string.IsNullOrEmpty(extension))
        {
            throw new ArgumentException(nameof(extension));
        }
        if (!Regex.IsMatch(extension, @"^\.(png|jpg|gif)$"))
        {
            throw new ArgumentException("Invalid extension", nameof(extension));
        }
        if (!Regex.IsMatch(newPath, @"(/[A-Za-z0-9]+)+?"))
        {
            throw new ArgumentException("Invalid path", nameof(newPath));
        }
        _extension = extension;
        _newPath = new PathString(newPath);
    }
    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;
        // Because we're redirecting back to the same app, stop 
        // processing if the request has already been redirected
        if (request.Path.StartsWithSegments(new PathString(_newPath)))
        {
            return;
        }
        if (request.Path.Value.EndsWith(_extension, StringComparison.OrdinalIgnoreCase))
        {
            var response = context.HttpContext.Response;
            response.StatusCode = (int) HttpStatusCode.MovedPermanently;
            context.Result = RuleResult.EndResponse;
            response.Headers[HeaderNames.Location] = 
                _newPath + request.Path + request.QueryString;
        }
    }
}
Ursprunglig begäran: /image.png
               
              
            
Ursprunglig begäran: /image.jpg
               
              
            
Regex-exempel
| Goal | Regex-sträng & Matchningsexempel | Ersättningssträng & Utdataexempel | 
|---|---|---|
| Skriv om sökvägen till querystring | ^path/(.*)/(.*)/path/abc/123 | path?var1=$1&var2=$2/path?var1=abc&var2=123 | 
| Ta bort avslutande snedstreck | (.*)/$/path/ | $1/path | 
| Framtvinga avslutande snedstreck | (.*[^/])$/path | $1//path/ | 
| Undvik att skriva om specifika begäranden | ^(.*)(?<!\.axd)$eller^(?!.*\.axd$)(.*)$Ja: /resource.htmNej: /resource.axd | rewritten/$1/rewritten/resource.htm/resource.axd | 
| Ordna om URL-segment | path/(.*)/(.*)/(.*)path/1/2/3 | path/$3/$2/$1path/3/2/1 | 
| Ersätt ett URL-segment | ^(.*)/segment2/(.*)/segment1/segment2/segment3 | $1/replaced/$2/segment1/replaced/segment3 | 
Det här dokumentet introducerar URL-omskrivning och ger instruktioner om hur du använder URL-omskrivningsmiddleware i ASP.NET Core-applikationer.
URL-omskrivning är en åtgärd för att ändra url:er för begäran baserat på en eller flera fördefinierade regler. URL-omskrivning skapar en abstraktion mellan resursplatser och deras adresser så att platserna och adresserna inte är nära länkade. URL-omskrivning är värdefullt i flera scenarier för att:
- Flytta eller ersätt serverresurser tillfälligt eller permanent och underhåll stabila positionerare för dessa resurser.
- Dela upp bearbetning av begäranden mellan olika appar eller mellan områden i en app.
- Ta bort, lägga till eller omorganisera URL-segment på inkommande begäranden.
- Optimera offentliga URL:er för sökmotoroptimering (SEO).
- Tillåt användning av egna offentliga URL:er för att hjälpa besökare att förutsäga innehållet som returneras genom att begära en resurs.
- Omdirigera osäkra begäranden till säkra slutpunkter.
- Förhindra snabblänkning, där en extern webbplats använder en värdbaserad statisk tillgång på en annan plats genom att länka tillgången till sitt eget innehåll.
Note
URL-omskrivning kan minska prestandan för en app. När det är möjligt begränsar du antalet och komplexiteten i reglerna.
Visa eller ladda ned exempelkod (hur du laddar ned)
URL-omdirigering och URL-omskrivning
Skillnaden i formulering mellan URL-omdirigering och URL-omskrivning är diskret men har viktiga konsekvenser för att tillhandahålla resurser till klienter. ASP.NET Cores URL Rewriting Middleware kan uppfylla behovet av båda.
En URL-omdirigering omfattar en åtgärd på klientsidan, där klienten instrueras att komma åt en resurs på en annan adress än den klient som ursprungligen begärdes. Detta kräver en tur och retur-resa till servern. Omdirigerings-URL:en som returneras till klienten visas i webbläsarens adressfält när klienten gör en ny begäran för resursen.
Om /resourceomdirigeras till /different-resourcesvarar servern att klienten ska hämta resursen på /different-resource med en statuskod som anger att omdirigeringen antingen är tillfällig eller permanent.
               
              
            
När du omdirigerar begäranden till en annan URL anger du om omdirigeringen är permanent eller tillfällig genom att ange statuskoden med svaret:
- Statuskoden - 301 - Moved Permanentlyanvänds där resursen har en ny, permanent URL och du vill instruera klienten att alla framtida begäranden för resursen ska använda den nya URL:en. Klienten kan cachlagra och återanvända svaret när en 301-statuskod mottas.
- Statuskoden 302 – Found används där omdirigeringen är tillfällig eller vanligtvis kan komma att ändras. Statuskoden 302 anger att klienten inte ska lagra URL:en och använda den i framtiden. 
Mer information om statuskoder finns i RFC 9110: Definitioner för statuskod.
En URL-omskrivning är en åtgärd på serversidan som tillhandahåller en resurs från en annan resursadress än den begärda klienten. Om du skriver om en URL krävs ingen tur och retur till servern. Den omskrivna URL:en returneras inte till klienten och visas inte i webbläsarens adressfält.
Om /resourceskrivs om till /different-resourcehämtar servern internt och returnerar resursen på /different-resource.
Även om klienten kanske kan hämta resursen på den omskrivna URL:en informeras inte klienten om att resursen finns på den omskrivna URL:en när den gör sin begäran och tar emot svaret.
               
              
            
Exempelapp för URL-omskrivning
Du kan utforska funktionerna i URL Rewriting Middleware med exempelappen. Appen tillämpar omdirigerings- och omskrivningsregler och visar den omdirigerade eller omskrivna URL:en för flera scenarier.
När du ska använda URL-omskrivning med mellanprogramvara
Använd URL Rewriting Middleware när du inte kan använda följande metoder:
- URL-omskrivningsmodul med IIS på Windows Server
- Apache mod_rewrite-modul på Apache Server
- URL-omskrivning på Nginx
Använd även mellanprogrammet när appen finns på HTTP.sys server (kallades tidigare WebListener).
De främsta orsakerna till att använda serverbaserade URL-omskrivningstekniker i IIS, Apache och Nginx är:
- Mellanprogrammet stöder inte alla funktioner i dessa moduler. - Vissa av funktionerna i servermodulerna fungerar inte med ASP.NET Core-projekt, till exempel - IsFile-begränsningarna i IIS-omskrivningsmodulen. I dessa scenarier använder du mellanprogrammet i stället.
- Prestandan för mellanprogrammet matchar förmodligen inte modulernas prestanda. - Benchmarking är det enda sättet att veta säkert vilken metod som försämrar prestanda mest eller om försämrad prestanda är försumbar. 
Package
Om du vill inkludera mellanprogrammet i projektet lägger du till en paketreferens till Microsoft.AspNetCore.App metapackage i projektfilen, som innehåller paketet Microsoft.AspNetCore.Rewrite .
När du inte använder Microsoft.AspNetCore.App metapaketet lägger du till en projektreferens till Microsoft.AspNetCore.Rewrite paketet.
Tillägg och alternativ
Upprätta url-omskrivnings- och omdirigeringsregler genom att skapa en instans av klassen RewriteOptions med tilläggsmetoder för var och en av dina omskrivningsregler. Länka flera regler i den ordning som du vill att de ska bearbetas. 
              RewriteOptions skickas till URL-omskrivningsmedlaren när det läggs till i begärandepipelinen med UseRewriter:
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Omdirigera icke-www till www
Det finns tre alternativ som gör det möjligt för appen att omdirigera icke-www förfrågningar till www:
- AddRedirectToWwwPermanent: Omdirigera begäran permanent till underdomänen - wwwom begäran inte är -- www. Omdirigerar med statuskoden Status308PermanentRedirect .
- AddRedirectToWww: Omdirigera begäran till underdomänen - wwwom den inkommande begäran inte är -- www. Omdirigerar med statuskoden Status307TemporaryRedirect . Genom en överbelastning kan du ange statuskoden för svaret. Använd ett fält i StatusCodes klassen för en statuskodtilldelning.
URL omdirigering
Använd AddRedirect för att omdirigera begäranden. Den första parametern innehåller din regex för matchning på sökvägen till den inkommande URL:en. Den andra parametern är ersättningssträngen. Den tredje parametern, om den finns, anger statuskoden. Om du inte anger statuskoden är statuskoden som standard 302 – Hittades, vilket indikerar att resursen tillfälligt flyttas eller ersätts.
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
I en webbläsare med utvecklarverktyg aktiverade skickar du en begäran till exempelappen med sökvägen /redirect-rule/1234/5678. Regex matchar begärandesökvägen på redirect-rule/(.*)och sökvägen ersätts med /redirected/1234/5678. Omdirigerings-URL:en skickas tillbaka till klienten med statuskoden 302 – Hittade . Webbläsaren gör en ny begäran på omdirigerings-URL:en, som visas i webbläsarens adressfält. Eftersom inga regler i exempelappen matchar på omdirigerings-URL:en:
- Den andra begäran tar emot ett svar på 200 – OK från appen.
- Brödtexten i svaret visar omdirigerings-URL:en.
En tur och retur-resa görs till servern när en URL omdirigeras.
Warning
Var försiktig när du upprättar omdirigeringsregler. Omdirigeringsregler utvärderas för varje begäran till appen, inklusive efter en omdirigering. Det är enkelt att oavsiktligt skapa en loop med oändliga omdirigeringar.
Ursprunglig begäran: /redirect-rule/1234/5678
               
              
            
Den del av uttrycket som finns inom parenteser kallas för en avbildningsgrupp. Uttryckets punkt (.) innebär matcha vilket tecken som helst. Asterisken (*) indikerar att föregående tecken matchas noll eller flera gånger. Därför samlas de två sista sökvägssegmenten i URL:en, 1234/5678, in av insamlingsgruppen (.*). Alla värden som du anger i begärande-URL:en efter redirect-rule/ registreras av den här enskilda insamlingsgruppen.
I ersättningssträngen infogas fångade grupper i strängen med dollartecknet ($) följt av sekvensnumret för fångsten. Det första fångstgruppens värde hämtas med $1, det andra med $2, och de fortsätter i följd för fångstgrupperna i din regex. Det finns bara en grupperad grupp i regex för omdirigeringsregeln i exempelappen, så det finns bara en inmatad grupp i ersättningssträngen, som är $1. När regeln tillämpas blir /redirected/1234/5678URL:en .
URL-omdirigering till en säker slutpunkt
Använd AddRedirectToHttps för att omdirigera HTTP-begäranden till samma värd och sökväg med hjälp av HTTPS-protokollet. Om statuskoden inte har angetts, används 302 – Funnen som standard av mellanprogrammet. Om porten inte har angetts:
- Mellanprogrammet använder nullsom standard.
- Schemat ändras till https(HTTPS-protokoll) och klienten kommer åt resursen på port 443.
I följande exempel visas hur du anger statuskoden till 301 - Moved Permanently och ändrar porten till 5001.
public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirectToHttps(301, 5001);
    app.UseRewriter(options);
}
Använd AddRedirectToHttpsPermanent för att omdirigera osäkra begäranden till samma värd och sökväg med säkert HTTPS-protokoll på port 443. Mellanprogrammet anger statuskoden till 301 - Moved Permanently.
public void Configure(IApplicationBuilder app)
{
    var options = new RewriteOptions()
        .AddRedirectToHttpsPermanent();
    app.UseRewriter(options);
}
Note
När du omdirigerar till en säker slutpunkt utan krav på ytterligare omdirigeringsregler rekommenderar vi att du använder HTTPS Redirection Middleware. Mer information finns i avsnittet Framtvinga HTTPS .
Exempelappen kan visa hur du använder AddRedirectToHttps eller AddRedirectToHttpsPermanent. Lägg till tilläggsmetoden i RewriteOptions. Gör en osäker begäran till appen på valfri URL. Stäng webbläsarens säkerhetsvarning om att det självsignerade certifikatet inte är betrott eller skapa ett undantag för att lita på certifikatet.
Ursprunglig begäran med AddRedirectToHttps(301, 5001):http://localhost:5000/secure
               
              
            
Ursprunglig begäran med AddRedirectToHttpsPermanent:http://localhost:5000/secure
               
              
            
URL rewrite
Använd AddRewrite för att skapa en regel för att skriva om URL:er. Den första parametern innehåller regex för matchning på den inkommande URL-sökvägen. Den andra parametern är ersättningssträngen. Den tredje parametern, skipRemainingRules: {true|false}, anger för mellanprogrammet om du vill hoppa över ytterligare omskrivningsregler om den aktuella regeln tillämpas.
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Ursprunglig begäran: /rewrite-rule/1234/5678
               
              
            
Careten (^) i början av uttrycket innebär att matchningen börjar i början av URL-sökvägen.
I det tidigare exemplet med omdirigeringsregeln redirect-rule/(.*)finns det ingen karat (^) i början av regex. Därför kan alla tecken följa redirect-rule/ i sökvägen för en lyckad matchning.
| Path | Match | 
|---|---|
| /redirect-rule/1234/5678 | Yes | 
| /my-cool-redirect-rule/1234/5678 | Yes | 
| /anotherredirect-rule/1234/5678 | Yes | 
Omskrivningsregeln, ^rewrite-rule/(\d+)/(\d+), matchar bara sökvägar om de börjar med rewrite-rule/. Observera skillnaden i matchning i följande tabell.
| Path | Match | 
|---|---|
| /rewrite-rule/1234/5678 | Yes | 
| /my-cool-rewrite-rule/1234/5678 | No | 
| /anotherrewrite-rule/1234/5678 | No | 
Efter ^rewrite-rule/-delen av uttrycket finns det två fångstgrupper, (\d+)/(\d+). Tecknen \dmatchar en siffra (tal). Plustecknet (+) innebär att matcha ett eller flera av föregående tecken. Url:en måste därför innehålla ett tal följt av ett snedstreck följt av ett annat tal. Dessa fångstgrupper matas in i den omskrivna URL:en som $1 och $2. Omskrivningsregelns ersättningssträng placerar de insamlade grupperna i frågesträngen. Den begärda sökvägen /rewrite-rule/1234/5678 ändras för att hämta resursen på /rewritten?var1=1234&var2=5678. Om en frågesträng finns på den ursprungliga begäran bevaras den när URL:en skrivs om.
Det finns ingen tur och retur-resa till servern för att hämta resursen. Om resursen finns hämtas den och returneras till klienten med statuskoden 200 – OK . Eftersom klienten inte omdirigeras ändras inte URL:en i webbläsarens adressfält. Klienter kan inte identifiera att en URL-omskrivningsåtgärd har inträffat på servern.
Note
Använd skipRemainingRules: true när det är möjligt eftersom matchningsregler är beräkningsmässigt dyra och ökar appens svarstid. För det snabbaste appsvaret:
- Ordna omskrivningsregler från den regel som oftast matchas till den som matchas minst ofta.
- Hoppa över bearbetningen av de återstående reglerna när en matchning sker och ingen ytterligare regelbearbetning krävs.
Apache mod_rewrite
Tillämpa Apache mod_rewrite-regler med AddApacheModRewrite. Kontrollera att regelfilen har distribuerats med appen. Mer information och exempel på mod_rewrite regler finns i Apache mod_rewrite.
A StreamReader används för att läsa reglerna från ApacheModRewrite.txt-regelfilen :
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Exempelappen omdirigerar begäranden från /apache-mod-rules-redirect/(.\*) till /redirected?id=$1. Svarsstatuskoden är 302 – Hittades.
# Rewrite path with additional sub directory
RewriteRule ^/apache-mod-rules-redirect/(.*) /redirected?id=$1 [L,R=302]
Ursprunglig begäran: /apache-mod-rules-redirect/1234
               
              
            
Mellanprogrammet stöder följande Apache mod_rewrite-servervariabler:
- CONN_REMOTE_ADDR
- HTTP_ACCEPT
- HTTP_CONNECTION
- HTTP_COOKIE
- HTTP_FORWARDED
- HTTP_HOST
- HTTP_REFERER
- HTTP_USER_AGENT
- HTTPS
- IPV6
- QUERY_STRING
- REMOTE_ADDR
- REMOTE_PORT
- REQUEST_FILENAME
- REQUEST_METHOD
- REQUEST_SCHEME
- REQUEST_URI
- SCRIPT_FILENAME
- SERVER_ADDR
- SERVER_PORT
- SERVER_PROTOCOL
- TIME
- TIME_DAY
- TIME_HOUR
- TIME_MIN
- TIME_MON
- TIME_SEC
- TIME_WDAY
- TIME_YEAR
Omskrivningsmodulregler för IIS-URL
Om du vill använda samma regeluppsättning som gäller för IIS URL Rewrite Module använder du AddIISUrlRewrite. Kontrollera att regelfilen har distribuerats med appen. Dirigera inte mellanprogrammet att använda appens web.config-fil när den körs på Windows Server IIS. Med IIS bör dessa regler lagras utanför appens web.config-fil för att undvika konflikter med IIS-omskrivningsmodulen. Mer information och exempel på regler för omskrivning av IIS-URL-modul finns i Använda url-omskrivningsmodul 2.0 och konfigurationsreferens för URL-omskrivningsmodul.
A StreamReader används för att läsa reglerna från IISUrlRewrite.xml regelfilen:
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Exempelappen skriver om begäranden från /iis-rules-rewrite/(.*) till /rewritten?id=$1. Svaret skickas till klienten med statuskoden 200 – OK .
<rewrite>
  <rules>
    <rule name="Rewrite segment to id querystring" stopProcessing="true">
      <match url="^iis-rules-rewrite/(.*)$" />
      <action type="Rewrite" url="rewritten?id={R:1}" appendQueryString="false"/>
    </rule>
  </rules>
</rewrite>
Ursprunglig begäran: /iis-rules-rewrite/1234
               
              
            
Om du har en aktiv IIS-omskrivningsmodul med regler på servernivå konfigurerade som skulle påverka appen på oönskade sätt kan du inaktivera IIS-omskrivningsmodulen för en app. Mer information finns i Inaktivera IIS-moduler.
Funktioner som inte stöds
Mellanprogrammet som släpptes med ASP.NET Core 2.x stöder inte följande funktioner för omskrivning av IIS-URL-modul:
- Regler för utgående trafik
- Anpassade servervariabler
- Wildcards
- LogRewrittenUrl
Servervariabler som stöds
Mellanprogrammet stöder följande IIS URL Rewrite Module-servervariabler:
- CONTENT_LENGTH
- CONTENT_TYPE
- HTTP_ACCEPT
- HTTP_CONNECTION
- HTTP_COOKIE
- HTTP_HOST
- HTTP_REFERER
- HTTP_URL
- HTTP_USER_AGENT
- HTTPS
- LOCAL_ADDR
- QUERY_STRING
- REMOTE_ADDR
- REMOTE_PORT
- REQUEST_FILENAME
- REQUEST_URI
Note
Du kan också hämta en IFileProvider via en PhysicalFileProvider. Den här metoden kan ge större flexibilitet för platserna för dina omskrivningsreglerfiler. Kontrollera att filerna för omskrivningsregler distribueras till servern på den sökväg som du anger.
PhysicalFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());
Metodbaserad regel
Använd Add för att implementera din egen regellogik i en metod. 
              Add exponerar RewriteContext, vilket gör HttpContext tillgänglig för användning i din metod. 
              RewriteContext.Result avgör hur ytterligare pipelinebearbetning hanteras. Ange värdet till ett av fälten RuleResult som beskrivs i följande tabell.
| Skriv om kontextresultat | Action | 
|---|---|
| RuleResult.ContinueRules(standardinställning) | Fortsätt att tillämpa regler. | 
| RuleResult.EndResponse | Sluta tillämpa regler och skicka svaret. | 
| RuleResult.SkipRemainingRules | Sluta tillämpa regler och skicka kontexten till nästa mellanprogram. | 
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Exempelappen visar en metod som omdirigerar begäranden för sökvägar som slutar med .xml. Om en begäran görs för /file.xmlomdirigeras begäran till /xmlfiles/file.xml. Statuskoden är inställd på 301 - Moved Permanently. När webbläsaren gör en ny begäran för /xmlfiles/file.xml, levererar Static File Middleware filen till klienten från mappen wwwroot/xmlfiles. För en omdirigering anger du uttryckligen statuskoden för svaret. Annars returneras statuskoden 200 – OK och omdirigeringen sker inte på klienten.
              RewriteRules.cs:
public static void RedirectXmlFileRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;
    // Because the client is redirecting back to the same app, stop 
    // processing if the request has already been redirected.
    if (request.Path.StartsWithSegments(new PathString("/xmlfiles")))
    {
        return;
    }
    if (request.Path.Value.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
    {
        var response = context.HttpContext.Response;
        response.StatusCode = (int) HttpStatusCode.MovedPermanently;
        context.Result = RuleResult.EndResponse;
        response.Headers[HeaderNames.Location] = 
            "/xmlfiles" + request.Path + request.QueryString;
    }
}
Den här metoden kan också skriva om begäranden. Exempelappen visar hur du skriver om sökvägen för en textfilbegäran så att filen file.txt från mappen wwwroot kan tjäna. Static File Middleware hanterar filen baserat på den uppdaterade sökvägen för begäran:
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
              RewriteRules.cs:
public static void RewriteTextFileRequests(RewriteContext context)
{
    var request = context.HttpContext.Request;
    if (request.Path.Value.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
    {
        context.Result = RuleResult.SkipRemainingRules;
        request.Path = "/file.txt";
    }
}
IRule-baserad regel
Använd Add för att använda regellogik i en klass som implementerar IRule gränssnittet. 
              IRule ger större flexibilitet jämfört med metodbaserad regelmetod. Implementeringsklassen kan innehålla en konstruktor som gör att du kan skicka in parametrar för ApplyRule metoden.
public void Configure(IApplicationBuilder app)
{
    using (StreamReader apacheModRewriteStreamReader = 
        File.OpenText("ApacheModRewrite.txt"))
    using (StreamReader iisUrlRewriteStreamReader = 
        File.OpenText("IISUrlRewrite.xml")) 
    {
        var options = new RewriteOptions()
            .AddRedirect("redirect-rule/(.*)", "redirected/$1")
            .AddRewrite(@"^rewrite-rule/(\d+)/(\d+)", "rewritten?var1=$1&var2=$2", 
                skipRemainingRules: true)
            .AddApacheModRewrite(apacheModRewriteStreamReader)
            .AddIISUrlRewrite(iisUrlRewriteStreamReader)
            .Add(MethodRules.RedirectXmlFileRequests)
            .Add(MethodRules.RewriteTextFileRequests)
            .Add(new RedirectImageRequests(".png", "/png-images"))
            .Add(new RedirectImageRequests(".jpg", "/jpg-images"));
        app.UseRewriter(options);
    }
    app.UseStaticFiles();
    app.Run(context => context.Response.WriteAsync(
        $"Rewritten or Redirected Url: " +
        $"{context.Request.Path + context.Request.QueryString}"));
}
Värdena för parametrarna i exempelappen kontrolleras för extension och newPath för att uppfylla flera villkor. 
              extension Måste innehålla ett värde och värdet måste vara .png, .jpgeller .gif. Om det newPath inte är giltigt utlöses en ArgumentException . Om en begäran görs för image.pngomdirigeras begäran till /png-images/image.png. Om en begäran görs för image.jpgomdirigeras begäran till /jpg-images/image.jpg. Statuskoden är inställd på 301 - Moved Permanently, och context.Result är inställd på att sluta bearbeta regler och skicka svaret.
public class RedirectImageRequests : IRule
{
    private readonly string _extension;
    private readonly PathString _newPath;
    public RedirectImageRequests(string extension, string newPath)
    {
        if (string.IsNullOrEmpty(extension))
        {
            throw new ArgumentException(nameof(extension));
        }
        if (!Regex.IsMatch(extension, @"^\.(png|jpg|gif)$"))
        {
            throw new ArgumentException("Invalid extension", nameof(extension));
        }
        if (!Regex.IsMatch(newPath, @"(/[A-Za-z0-9]+)+?"))
        {
            throw new ArgumentException("Invalid path", nameof(newPath));
        }
        _extension = extension;
        _newPath = new PathString(newPath);
    }
    public void ApplyRule(RewriteContext context)
    {
        var request = context.HttpContext.Request;
        // Because we're redirecting back to the same app, stop 
        // processing if the request has already been redirected
        if (request.Path.StartsWithSegments(new PathString(_newPath)))
        {
            return;
        }
        if (request.Path.Value.EndsWith(_extension, StringComparison.OrdinalIgnoreCase))
        {
            var response = context.HttpContext.Response;
            response.StatusCode = (int) HttpStatusCode.MovedPermanently;
            context.Result = RuleResult.EndResponse;
            response.Headers[HeaderNames.Location] = 
                _newPath + request.Path + request.QueryString;
        }
    }
}
Ursprunglig begäran: /image.png
               
              
            
Ursprunglig begäran: /image.jpg
               
              
            
Regex-exempel
| Goal | Regex-sträng & Matchningsexempel | Ersättningssträng & Utdataexempel | 
|---|---|---|
| Skriv om sökvägen till querystring | ^path/(.*)/(.*)/path/abc/123 | path?var1=$1&var2=$2/path?var1=abc&var2=123 | 
| Ta bort avslutande snedstreck | (.*)/$/path/ | $1/path | 
| Framtvinga avslutande snedstreck | (.*[^/])$/path | $1//path/ | 
| Undvik att skriva om specifika begäranden | ^(.*)(?<!\.axd)$eller^(?!.*\.axd$)(.*)$Ja: /resource.htmNej: /resource.axd | rewritten/$1/rewritten/resource.htm/resource.axd | 
| Ordna om URL-segment | path/(.*)/(.*)/(.*)path/1/2/3 | path/$3/$2/$1path/3/2/1 | 
| Ersätt ett URL-segment | ^(.*)/segment2/(.*)/segment1/segment2/segment3 | $1/replaced/$2/segment1/replaced/segment3 | 
Ytterligare resurser
- Visa eller ladda ned exempelkod (hur du laddar ned)
- 
              
              RewriteMiddleware(referenskälla)
- Start av applikation i ASP.NET Core
- ASP.NET Core Middleware
- Reguljära uttryck i .NET
- Språk för reguljärt uttryck – snabbreferens
- Apache mod_rewrite
- Använda url-omskrivningsmodul 2.0 (för IIS)
- Konfigurationsreferens för URL-omskrivningsmodul
- Behåll en enkel URL-struktur
- 10 tips och knep för URL-omskrivning
- Snedstreck eller inte snedstreck
ASP.NET Core