Dela via


URL-omskrivning av mellanprogram i ASP.NET Core

Note

Det här är inte den senaste versionen av den här artikeln. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .

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.

En WebAPI-tjänstslutpunkt har tillfälligt ändrats från version 1 (v1) till version 2 (v2) på servern. En klient skickar en begäran till tjänsten på sökvägen /v1/api för version 1. Servern skickar tillbaka ett 302-svar (hittades) med den nya, tillfälliga sökvägen för tjänsten i version 2 /v2/api. Klienten skickar en andra begäran till tjänsten vid omdirigerings-URL:en. Servern svarar med statuskoden 200 (OK).

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 Permanently anvä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 - 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.

En WebAPI-tjänstslutpunkt har ändrats från version 1 (v1) till version 2 (v2) på servern. En klient skickar en begäran till tjänsten på sökvägen /v1/api för version 1. Begärande-URL:en skrivs om för att få åtkomst till tjänsten på sökvägen /v2/api för version 2. Tjänsten svarar klienten med statuskoden 200 (OK).

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:

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:

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 null som 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.json filen.
  • Det går inte att ta bort s från https://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.

Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar: Lägg till omdirigering till HTTPS

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: true nä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.htm
Nej: /path4/resource.axd
rewritten/$1
/rewritten/resource.htm
/resource.axd
Ordna om URL-segment path5/(.*)/(.*)/(.*)
path5/1/2/3
path5/$3/$2/$1
path5/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.

En WebAPI-tjänstslutpunkt har tillfälligt ändrats från version 1 (v1) till version 2 (v2) på servern. En klient skickar en begäran till tjänsten på sökvägen /v1/api för version 1. Servern skickar tillbaka ett 302-svar (hittades) med den nya, tillfälliga sökvägen för tjänsten i version 2 /v2/api. Klienten skickar en andra begäran till tjänsten vid omdirigerings-URL:en. Servern svarar med statuskoden 200 (OK).

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 Permanently anvä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.

En WebAPI-tjänstslutpunkt har ändrats från version 1 (v1) till version 2 (v2) på servern. En klient skickar en begäran till tjänsten på sökvägen /v1/api för version 1. Begärande-URL:en skrivs om för att få åtkomst till tjänsten på sökvägen /v2/api för version 2. Tjänsten svarar klienten med statuskoden 200 (OK).

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:

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:

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

Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar: Lägg till omdirigering

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 null som 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

Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar: Lägg till omdirigering till HTTPS

Ursprunglig begäran med AddRedirectToHttpsPermanent:http://localhost:5000/secure

Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar: Lägg till omdirigering till HTTPS permanent

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

Webbläsarfönster med utvecklarverktyg som spårar begäran och svar: Lägg till omskrivning

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

Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar: Lägg till Apache mod-omdirigering

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

Webbläsarfönster med utvecklarverktyg som spårar begäran och svar: Lägg till omskrivning av IIS-URL

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

Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar för image.png

Ursprunglig begäran: /image.jpg

Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar för 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.htm
Nej: /resource.axd
rewritten/$1
/rewritten/resource.htm
/resource.axd
Ordna om URL-segment path/(.*)/(.*)/(.*)
path/1/2/3
path/$3/$2/$1
path/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.

En WebAPI-tjänstslutpunkt har tillfälligt ändrats från version 1 (v1) till version 2 (v2) på servern. En klient skickar en begäran till tjänsten på sökvägen /v1/api för version 1. Servern skickar tillbaka ett 302-svar (hittades) med den nya, tillfälliga sökvägen för tjänsten i version 2 /v2/api. Klienten skickar en andra begäran till tjänsten vid omdirigerings-URL:en. Servern svarar med statuskoden 200 (OK).

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 Permanently anvä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.

En WebAPI-tjänstslutpunkt har ändrats från version 1 (v1) till version 2 (v2) på servern. En klient skickar en begäran till tjänsten på sökvägen /v1/api för version 1. Begärande-URL:en skrivs om för att få åtkomst till tjänsten på sökvägen /v2/api för version 2. Tjänsten svarar klienten med statuskoden 200 (OK).

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:

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:

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

Lägg till omdirigering: Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar

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 null som 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

Lägg till omdirigering till HTTPS: Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar

Ursprunglig begäran med AddRedirectToHttpsPermanent:http://localhost:5000/secure

Lägg till omdirigering till HTTPS permanent: Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar

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

Lägg till omskrivning: Webbläsarfönster med utvecklarverktyg som spårar begäran och svar

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

Lägg till Apache mod-omdirigering: Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar

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

Lägg till omskrivning av IIS-URL: Webbläsarfönster med utvecklarverktyg som spårar begäran och svaret

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

För image.png: Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar

Ursprunglig begäran: /image.jpg

För image.jpg: Webbläsarfönster med utvecklarverktyg som spårar begäranden och svar

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.htm
Nej: /resource.axd
rewritten/$1
/rewritten/resource.htm
/resource.axd
Ordna om URL-segment path/(.*)/(.*)/(.*)
path/1/2/3
path/$3/$2/$1
path/3/2/1
Ersätt ett URL-segment ^(.*)/segment2/(.*)
/segment1/segment2/segment3
$1/replaced/$2
/segment1/replaced/segment3

Ytterligare resurser