Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Note
Dit is niet de nieuwste versie van dit artikel. Zie de .NET 9-versie van dit artikel voor de huidige release.
Warning
Deze versie van ASP.NET Core wordt niet meer ondersteund. Zie het .NET- en .NET Core-ondersteuningsbeleid voor meer informatie. Zie de .NET 9-versie van dit artikel voor de huidige release.
Important
Deze informatie heeft betrekking op een pre-releaseproduct dat aanzienlijk kan worden gewijzigd voordat het commercieel wordt uitgebracht. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, met betrekking tot de informatie die hier wordt verstrekt.
Zie de .NET 9-versie van dit artikel voor de huidige release.
Door Kirk Larkin en Rick Anderson
Dit artikel introduceert URL-herwerking en biedt instructies voor het gebruik van URL Rewriting Middleware in ASP.NET Core-apps.
URL-herschrijven is het wijzigen van aanvraag-URL's op basis van een of meer vooraf gedefinieerde regels. Bij het herschrijven van URL's wordt een abstractie gemaakt tussen resourcelocaties en hun adressen, zodat de locaties en adressen niet nauw zijn gekoppeld. URL-herschrijven is in verschillende scenario's waardevol voor:
- Verplaats of vervang serverresources tijdelijk of permanent en onderhoud stabiele locators voor deze resources.
- Aanvraagverwerking splitsen in verschillende apps of in verschillende gebieden van één app.
- URL-segmenten voor binnenkomende aanvragen verwijderen, toevoegen of opnieuw organiseren.
- Optimaliseer openbare URL's voor zoekmachineoptimalisatie (SEO).
- Hiermee staat u het gebruik van vriendelijke openbare URL's toe om bezoekers te helpen de geretourneerde inhoud te voorspellen bij het aanvragen van een bron.
- Onbeveiligde aanvragen omleiden naar beveiligde eindpunten.
- Hotlinking voorkomen, waarbij een externe site gebruikmaakt van een gehoste statische asset op een andere site door de asset te koppelen aan een eigen inhoud.
Het herschrijven van URL's kan de prestaties van een app verminderen. Beperk het aantal en de complexiteit van regels.
URL-omleiding en URL-herschrijven
Het verschil in formulering tussen URL-omleiding en URL-herschrijven is subtiel, maar heeft belangrijke gevolgen voor het leveren van resources aan clients. ASP.NET Core's URL Rewriting Middleware kan voldoen aan de behoefte aan beide.
Een URL-omleiding omvat een bewerking aan de clientzijde, waarbij de client wordt geïnstrueerd om toegang te krijgen tot een resource op een ander adres dan de oorspronkelijk aangevraagde client. Hiervoor is een aanroep naar de server vereist. De omleidings-URL die naar de client wordt geretourneerd, wordt weergegeven in de adresbalk van de browser wanneer de client een nieuwe aanvraag voor de resource indient.
Als /resource wordt omgeleid naar /different-resource, reageert de server dat de client de resource /different-resource moet verkrijgen met een statuscode die aangeeft dat de omleiding tijdelijk of permanent is.
Wanneer u aanvragen omleidt naar een andere URL, geeft u aan of de omleiding permanent of tijdelijk is door de statuscode met het antwoord op te geven:
De
301 - Moved Permanentlystatuscode wordt gebruikt waar de resource een nieuwe, permanente URL heeft en dat alle toekomstige aanvragen voor de resource de nieuwe URL moeten gebruiken. De client kan het antwoord in de cache opslaan en opnieuw gebruiken wanneer er een 301-statuscode wordt ontvangen.De
302 - Foundstatuscode wordt gebruikt wanneer de omleiding tijdelijk is of over het algemeen onderhevig is aan wijzigingen. De 302-statuscode geeft aan dat de client de URL niet hoeft op te slaan en in de toekomst te gebruiken.
Zie RFC 9110: Statuscodedefinities voor meer informatie over statuscodes.
Een URL rewrite is een bewerking aan de serverzijde die een resource levert van een ander resourceadres dan dat de client heeft opgevraagd. Voor het herschrijven van een URL is geen retour naar de server vereist. De herschreven URL wordt niet geretourneerd naar de client en wordt niet weergegeven in de adresbalk van de browser.
Als /resource wordt herschreven naar /different-resource, haalt de server intern de resource op en retourneert deze naar .
Hoewel de client de resource mogelijk kan ophalen op de herschreven URL, wordt de client niet geïnformeerd dat de resource bestaat op de herschreven URL wanneer deze de aanvraag indient en het antwoord ontvangt.
Voorbeeld-app voor het herschrijven van URL's
Verken de functies van de URL Rewriting Middleware met de voorbeeldapp. De app past omleidings- en herschrijfregels toe en toont de omgeleide of herschreven URL voor verschillende scenario's.
Wanneer gebruikt u middleware voor het herschrijven van URL's
Gebruik middleware voor het herschrijven van URL's wanneer de volgende benaderingen niet bevredigend zijn:
- URL-module herschrijven met IIS op Windows Server
- Apache mod_rewrite-module op de Apache-server
- URL-herschrijven op Nginx
Gebruik de middleware voor het herschrijven van URL's wanneer de app wordt gehost op HTTP.sys server.
De belangrijkste redenen om de technologieën voor het herschrijven van URL's op de server te gebruiken in IIS, Apache en Nginx zijn:
De middleware biedt geen ondersteuning voor de volledige functies van deze modules.
Sommige van de functies van de servermodules werken niet met ASP.NET Core-projecten, zoals de
IsFileenIsDirectorybeperkingen van de IIS-herschrijfmodule. Gebruik in deze scenario's in plaats daarvan de middleware.De prestaties van de middleware komen waarschijnlijk niet overeen met die van de modules.
Benchmarking is de enige manier om te weten met zekerheid welke aanpak de prestaties het meest verslechtert of als verminderde prestaties verwaarloosbaar zijn.
Uitbreiding en opties
Stel regels voor het herschrijven en omleiden van URL's in door een exemplaar van de klasse RewriteOptions te maken met extensiemethoden voor elk van de herschrijfregels. Koppel meerdere regels in de volgorde waarin ze moeten worden verwerkt. De RewriteOptions waarden worden doorgegeven aan de URL-herschrijfmiddleware wanneer het met UseRewriter aan de verzoekpijplijn wordt toegevoegd.
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();
In de voorgaande code MethodRules is een door de gebruiker gedefinieerde klasse. Zie RewriteRules.cs in dit artikel voor meer informatie.
Non-www omleiden naar www
Met drie opties kan de app verzoeken die geen www betreffen omleiden naar www.
AddRedirectToWwwPermanent: Verzoek permanent omleiden naar het
wwwsubdomein als het verzoek niet-wwwis. Redirects met de statuscode Status308PermanentRedirect.AddRedirectToWww: De aanvraag omleiden naar het
wwwsubdomein als de binnenkomende aanvraag niet iswww. Omleidingen met een statuscode Status307TemporaryRedirect. Een overbelasting maakt het mogelijk om de statuscode voor het antwoord op te geven. Gebruik een veld van de StatusCodes klasse voor een statuscodetoewijzing.
URL-doorverwijzing
Gebruik AddRedirect om aanvragen om te leiden. De eerste parameter bevat de reguliere .NET-expressie (Regex) voor vergelijking op het pad van de binnenkomende URL. De tweede parameter is de vervangende tekenreeks. De derde parameter, indien aanwezig, geeft de statuscode op. Als de statuscode niet is opgegeven, wordt de statuscode standaard ingesteld op 302 - Gevonden, wat aangeeft dat de resource tijdelijk wordt verplaatst of vervangen.
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();
In een browser waarvoor ontwikkelhulpprogramma's zijn ingeschakeld, moet u een aanvraag indienen bij de voorbeeld-app met het pad /redirect-rule/1234/5678. De reguliere expressie komt overeen met het aanvraagpad op redirect-rule/(.*)en het pad wordt vervangen door /redirected/1234/5678. De omleidings-URL wordt teruggestuurd naar de client met een statuscode 302 - Gevonden . De browser doet een nieuwe aanvraag bij de omleidings-URL, die wordt weergegeven in de adresbalk van de browser. Omdat er geen regels in de voorbeeld-app overeenkomen met de omleidings-URL:
- De tweede aanvraag ontvangt een 200 - OK-antwoord van de app.
- In de hoofdtekst van het antwoord wordt de omleidings-URL weergegeven.
Er wordt een verbinding met de server gemaakt wanneer een URL wordt omgeleid.
Warning
Wees voorzichtig bij het opstellen van omleidingsregels. Omleidingsregels worden geëvalueerd op elke aanvraag naar de app, inclusief na een omleiding. Het is eenvoudig om per ongeluk een lus met oneindige omleidingen te maken.
Het deel van de expressie tussen haakjes wordt een capture-groep genoemd. De punt (.) van de expressie betekent dat elk teken overeenkomt. Het sterretje (*) geeft aan dat het voorgaande teken nul of meer keren overeenkomt. Daarom worden de laatste twee padsegmenten van de URL, 1234/5678vastgelegd door de capture-groep (.*). Elke waarde die is opgegeven in de aanvraag-URL na redirect-rule/, wordt vastgelegd door deze enkele capture-groep.
In de vervangende tekenreeks worden vastgelegde groepen in de tekenreeks geïnjecteerd met het dollarteken ($) gevolgd door het volgnummer van de opname. De eerste waarde van de capture-groep wordt verkregen met $1, de tweede met $2en ze worden op volgorde voortgezet voor de capture-groepen in de reguliere expressie. Er is slechts één vastgelegde groep in de reguliere expressie van de omleidingsregel, redirect-rule/(.*)dus er is slechts één geïnjecteerde groep in de vervangende tekenreeks.$1 Wanneer de regel wordt toegepast, wordt de URL /redirected/1234/5678.
Probeer /redirect-rule/1234/5678 met de browserhulpprogramma's op het Netwerk-tabblad.
URL-omleiding naar een beveiligd eindpunt
Gebruik AddRedirectToHttps om HTTP-aanvragen om te leiden naar dezelfde host en hetzelfde pad via het HTTPS-protocol. Als de statuscode niet is opgegeven, wordt de middleware standaard ingesteld op 302 - Gevonden. Als de poort niet is opgegeven:
- De middleware wordt standaard ingesteld op
null. - Het schema wordt gewijzigd in
https(HTTPS-protocol) en de client heeft toegang tot de resource op poort 443.
In het volgende voorbeeld ziet u hoe u de statuscode instelt op 301 - Moved Permanently en de poort wijzigt naar de HTTPS-poort die wordt gebruikt door Kestrel op localhost. In productie is de HTTPS-poort ingesteld op 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();
Gebruik AddRedirectToHttpsPermanent om onveilige aanvragen om te leiden naar dezelfde host en hetzelfde pad met het beveiligde HTTPS-protocol op poort 443. De middleware stelt de statuscode in op 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
Wanneer u omleidt naar een beveiligd eindpunt zonder de vereiste voor aanvullende omleidingsregels, raden we u aan om Middleware voor HTTPS-omleiding te gebruiken. Zie HTTPS afdwingen voor meer informatie.
De voorbeeld-app laat zien hoe u deze gebruikt AddRedirectToHttps of AddRedirectToHttpsPermanent. Maak een onveilige HTTP-aanvraag naar de app op http://redirect6.azurewebsites.net/iis-rules-rewrite/xyz. Bij het testen van HTTP naar HTTPS-omleiding met localhost:
- Gebruik de HTTP-URL, die een andere poort heeft dan de HTTPS-URL. De HTTP-URL bevindt zich in het
Properties/launchSettings.jsonbestand. - Het verwijderen van de
svanhttps://localhost/{port}mislukt omdat localhost niet reageert via HTTP op de HTTPS-poort.
De volgende afbeelding toont de weergave van de F12-browserhulpprogramma's van een verzoek naar http://redirect6.azurewebsites.net/iis-rules-rewrite/xyz met behulp van de voorgaande code.
URL rewrite
Hiermee AddRewrite maakt u een regel voor het herschrijven van URL's. De eerste parameter bevat de reguliere expressie voor vergelijking op het binnenkomende URL-pad. De tweede parameter is de vervangende tekenreeks. De derde parameter, skipRemainingRules: {true|false}geeft aan bij de middleware of aanvullende herschrijfregels al dan niet moeten worden overgeslagen als de huidige regel wordt toegepast.
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();
Probeer de aanvraag uit te voeren https://redirect6.azurewebsites.net/rewrite-rule/1234/5678
De caret (^) aan het begin van de expressie geeft aan dat het overeenkomen begint aan het begin van het URL-pad.
In het eerdere voorbeeld met de omleidingsregel, redirect-rule/(.*) is er geen caret (^) aan het begin van de reguliere expressie. Daarom kunnen alle tekens voorafgaan aan redirect-rule/ het pad voor een geslaagde overeenkomst.
| Path | Match |
|---|---|
/redirect-rule/1234/5678 |
Yes |
/my-cool-redirect-rule/1234/5678 |
Yes |
/anotherredirect-rule/1234/5678 |
Yes |
De herschrijfregel, ^rewrite-rule/(\d+)/(\d+)komt alleen overeen met paden als ze beginnen met rewrite-rule/. In de volgende tabel ziet u het verschil in vergelijking.
| Path | Match |
|---|---|
/rewrite-rule/1234/5678 |
Yes |
/my-cool-rewrite-rule/1234/5678 |
No |
/anotherrewrite-rule/1234/5678 |
No |
Na het ^rewrite-rule/ gedeelte van de expressie zijn er twee capturegroepen. (\d+)/(\d+) De \d tekens komen overeen met een cijfer (getal). Het plusteken (+) betekent dat het overeenkomt met een of meer van het voorgaande teken. Daarom moet de URL een getal bevatten, gevolgd door een slash gevolgd door een ander getal. Deze capture-groepen worden opgenomen in de herschreven URL als $1 en $2. Met de herschrijfregelvervangingsreeks worden de vastgelegde groepen opgenomen in de querytekenreeks. Het aangevraagde pad /rewrite-rule/1234/5678 wordt herschreven om de bron bij /rewritten?var1=1234&var2=5678 terug te geven. Als een querytekenreeks aanwezig is in de oorspronkelijke aanvraag, blijft deze behouden wanneer de URL wordt herschreven.
Er is geen ronde naar de server om de resource op te halen. Als de resource bestaat, wordt deze opgehaald en geretourneerd naar de client met een statuscode 200 - OK . Omdat de client niet wordt omgeleid, verandert de URL in de adresbalk van de browser niet. Clients kunnen niet detecteren dat er een URL-herschrijfbewerking is opgetreden op de server.
Tips voor betere prestaties voor het herschrijven en omleiden van URL's
Voor het snelste antwoord:
- Regels herschrijven van de meest frequent overeenkomende regel naar de minst vaak overeenkomende regel.
- Gebruik
skipRemainingRules: truewaar mogelijk, omdat het overeenkomen van regels rekenkundig intensief is en de reactietijd van apps verhoogt. Sla de verwerking van de resterende regels over wanneer er een overeenkomst plaatsvindt en er is geen aanvullende regelverwerking vereist.
Warning
Een kwaadwillende gebruiker kan dure invoer aanleveren bij RegularExpressions, waardoor een Denial-of-Service-aanval ontstaat. ASP.NET Core framework-API's die gebruikmaken van RegularExpressions, stellen een time-out in. De Regex-time-out (_regexTimeout) van de RedirectRule klasse en RewriteRule klasse hebben beide een time-out van één seconde.
Note
Documentatiekoppelingen naar .NET-referentiebron laden meestal de standaardbranch van de opslagplaats, die de huidige ontwikkeling vertegenwoordigt voor de volgende release van .NET. Als u een tag voor een specifieke release wilt selecteren, gebruikt u de Switch branches of tags vervolgkeuzelijst. Zie Een versietag selecteren van ASP.NET Core-broncode (dotnet/AspNetCore.Docs #26205)voor meer informatie.
Apache mod_rewrite
Apache mod_rewrite regels toepassen met AddApacheModRewrite. Zorg ervoor dat het regelsbestand is geïmplementeerd met de app. Zie Apache mod_rewrite voor meer informatie en voorbeelden van mod_rewrite regels.
Een StreamReader wordt gebruikt om de regels uit het ApacheModRewrite.txt-regelbestand te lezen.
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();
Met de voorbeeld-app worden aanvragen omgeleid van /apache-mod-rules-redirect/(.\*) naar /redirected?id=$1. De antwoordstatuscode is 302 - Gevonden.
# Rewrite path with additional sub directory
RewriteRule ^/apache-mod-rules-redirect/(.*) /redirected?id=$1 [L,R=302]
Probeer de aanvraag uit te voeren https://redirect6.azurewebsites.net/apache-mod-rules-redirect/1234
De Apache middleware ondersteunt de volgende Apache mod_rewrite-servervariabelen:
- 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
Documentatiekoppelingen naar .NET-referentiebron laden meestal de standaardbranch van de opslagplaats, die de huidige ontwikkeling vertegenwoordigt voor de volgende release van .NET. Als u een tag voor een specifieke release wilt selecteren, gebruikt u de Switch branches of tags vervolgkeuzelijst. Zie Een versietag selecteren van ASP.NET Core-broncode (dotnet/AspNetCore.Docs #26205)voor meer informatie.
Regels voor het hernoemen van URLs met de IIS-module
Als u dezelfde regelset wilt gebruiken die van toepassing is op de IIS-URL-herschrijfmodule, gebruikt u AddIISUrlRewrite. Zorg ervoor dat het regelsbestand is geïmplementeerd met de app. Richt de middleware niet om het web.config-bestand van de app te gebruiken bij uitvoering op Windows Server IIS. Met IIS moeten deze regels worden opgeslagen buiten het web.config-bestand van de app om conflicten met de IIS-herschrijfmodule te voorkomen. Zie voor meer informatie en voorbeelden van IIS URL herschrijvingsmoduleregels URL herschrijven module 2.0 gebruiken en URL herschrijven moduleconfiguratiereferentie.
A StreamReader wordt gebruikt om de regels uit het IISUrlRewrite.xml regelsbestand te lezen:
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();
De voorbeeld-app herschrijft aanvragen van /iis-rules-rewrite/(.*) naar /rewritten?id=$1. Het antwoord wordt verzonden naar de client met een statuscode 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>
Probeer de aanvraag uit te voeren https://redirect6.azurewebsites.net/iis-rules-rewrite/xyz
Apps met een actieve IIS-herschrijfmodule met regels op serverniveau die op ongewenste manieren van invloed zijn op de app:
- Overweeg om de IIS-herschrijfmodule voor de app uit te schakelen.
- Zie IIS-modules uitschakelen voor meer informatie.
Niet-ondersteunde functies
De middleware biedt geen ondersteuning voor de volgende functies van iis-URL-herschrijfmodule:
- Regels voor uitgaand verkeer
- Aangepaste servervariabelen
- Wildcards
- LogRewrittenUrl
Ondersteunde servervariabelen
De middleware ondersteunt de volgende IIS-URL-herschrijfmoduleservervariabelen:
- 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
Documentatiekoppelingen naar .NET-referentiebron laden meestal de standaardbranch van de opslagplaats, die de huidige ontwikkeling vertegenwoordigt voor de volgende release van .NET. Als u een tag voor een specifieke release wilt selecteren, gebruikt u de Switch branches of tags vervolgkeuzelijst. Zie Een versietag selecteren van ASP.NET Core-broncode (dotnet/AspNetCore.Docs #26205)voor meer informatie.
IFileProvider kan worden verkregen via een PhysicalFileProvider. Deze benadering biedt mogelijk meer flexibiliteit voor de locatie van herschrijfregelsbestanden. Zorg ervoor dat de herschrijfregelsbestanden worden geïmplementeerd op de server op het opgegeven pad.
var fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());
Regel op basis van methode
Gebruik Add dit om aangepaste regellogica in een methode te implementeren.
Add stelt de RewriteContext bloot, die HttpContext beschikbaar maakt voor gebruik in omleidingsmethoden. De RewriteContext.Result eigenschap bepaalt hoe aanvullende pijplijnverwerking wordt verwerkt. Stel de waarde in op een van de RuleResult velden die in de volgende tabel worden beschreven.
| Contextresultaat herschrijven | Action |
|---|---|
RuleResult.ContinueRules (standaard) |
Ga door met het toepassen van regels. |
RuleResult.EndResponse |
Stop met het toepassen van regels en verzend het antwoord. |
RuleResult.SkipRemainingRules |
Stop met het toepassen van regels en verzend de context naar de volgende middleware. |
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();
De voorbeeld-app demonstreert een methode die aanvragen omleidt voor paden die eindigen op .xml. Wanneer een aanvraag wordt ingediend voor /file.xml:
- De aanvraag wordt omgeleid naar
/xmlfiles/file.xml - De statuscode is ingesteld op
301 - Moved Permanently. Wanneer de browser een nieuwe aanvraag voor/xmlfiles/file.xmldoet, levert Static File Middleware het bestand aan de client vanuit de map wwwroot/xmlfiles. Stel voor een omleiding expliciet de statuscode van het antwoord in. Anders wordt een 200 - OK-statuscode geretourneerd en vindt de omleiding niet plaats op de client.
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;
}
}
Deze benadering kan ook aanvragen herschrijven. De voorbeeld-app laat zien hoe u het pad herschrijft voor een tekstbestandsaanvraag om het file.txt tekstbestand uit de map wwwroot te verwerken. Static File Middleware dient het bestand op basis van het bijgewerkte aanvraagpad:
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";
}
}
Regel op basis van IRule
Gebruik Add dit om regellogica te gebruiken in een klasse waarmee de IRule interface wordt geïmplementeerd.
IRule biedt meer flexibiliteit ten opzichte van het gebruik van de methodegebaseerde regelbenadering. De implementatieklasse kan een constructor bevatten waarmee parameters voor de ApplyRule methode kunnen worden doorgegeven.
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();
De waarden van de parameters in de voorbeeld-app voor de extension en de newPath worden gecontroleerd om aan verschillende voorwaarden te voldoen. De extension moet een waarde bevatten en die waarde moet .png, .jpg of .gif zijn. Als de newPath waarde niet geldig is, wordt er een ArgumentException gegenereerd. Als er een verzoek wordt gedaan naar image.png, wordt het verzoek omgeleid naar /png-images/image.png. Als er een verzoek wordt gedaan naar image.jpg, wordt het verzoek omgeleid naar /jpg-images/image.jpg. De statuscode is ingesteld op 301 - Moved Permanentlyen de context.Result statuscode is ingesteld om de verwerking van regels te stoppen en het antwoord te verzenden.
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-aanvraag:
https://redirect6.azurewebsites.net/image.png - JPG-aanvraag:
https://redirect6.azurewebsites.net/image.jpg
Regex-voorbeelden
| Goal | Regex-tekenreeks & Voorbeeld van overeenkomst |
Vervangende tekenreeks & Voorbeeld van uitvoer |
|---|---|---|
| Pad herschrijven naar querytekenreeks | ^path/(.*)/(.*)/path/abc/123 |
path?var1=$1&var2=$2/path?var1=abc&var2=123 |
| Verwijder trailing slash | ^path2/(.*)/$/path2/xyz/ |
$1/path2/xyz |
| Afsluitende slash afdwingen | ^path3/(.*[^/])$/path3/xyz |
$1//path3/xyz/ |
| Schrijf specifieke aanvragen niet opnieuw |
^(.*)(?<!\.axd)$ of ^(?!.*\.axd$)(.*)$Ja: /path4/resource.htmNee: /path4/resource.axd |
rewritten/$1/rewritten/resource.htm/resource.axd |
| URL-segmenten opnieuw rangschikken | path5/(.*)/(.*)/(.*)path5/1/2/3 |
path5/$3/$2/$1path5/3/2/1 |
| Een URL-segment vervangen | ^path6/(.*)/segment2/(.*)^path6/segment1/segment2/segment3 |
path6/$1/replaced/$2/path6/segment1/replaced/segment3 |
De koppelingen in de voorgaande tabel gebruiken de volgende code die is geïmplementeerd in 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();
In de meeste voorgaande voorbeelden van reguliere expressies wordt de letterlijke waarden path gebruikt om unieke testbare herschrijfregels te maken voor het geïmplementeerde voorbeeld. Normaal gesproken zou de reguliere expressie niet bevatten path. Zie bijvoorbeeld deze tabel met voorbeelden van reguliere expressies .
In dit document maakt u kennis met het herschrijven van URL's met instructies voor het gebruik van URL-herschrijven middleware in ASP.NET Core-apps.
URL-herschrijven is het wijzigen van aanvraag-URL's op basis van een of meer vooraf gedefinieerde regels. Bij het herschrijven van URL's wordt een abstractie gemaakt tussen resourcelocaties en hun adressen, zodat de locaties en adressen niet nauw zijn gekoppeld. URL-herschrijven is in verschillende scenario's waardevol voor:
- Verplaats of vervang serverresources tijdelijk of permanent en onderhoud stabiele locators voor deze resources.
- Aanvraagverwerking splitsen in verschillende apps of in verschillende gebieden van één app.
- URL-segmenten voor binnenkomende aanvragen verwijderen, toevoegen of opnieuw organiseren.
- Optimaliseer openbare URL's voor zoekmachineoptimalisatie (SEO).
- Hiermee staat u het gebruik van vriendelijke openbare URL's toe om bezoekers te helpen de geretourneerde inhoud te voorspellen bij het aanvragen van een bron.
- Onbeveiligde aanvragen omleiden naar beveiligde eindpunten.
- Hotlinking voorkomen, waarbij een externe site gebruikmaakt van een gehoste statische asset op een andere site door de asset te koppelen aan een eigen inhoud.
Note
Het herschrijven van URL's kan de prestaties van een app verminderen. Beperk waar mogelijk het aantal en de complexiteit van regels.
Voorbeeldcode bekijken of downloaden (hoe download je)
URL-omleiding en URL-herschrijven
Het verschil in formulering tussen URL-omleiding en URL-herschrijven is subtiel, maar heeft belangrijke gevolgen voor het leveren van resources aan clients. ASP.NET Core's URL Rewriting Middleware kan voldoen aan de behoefte aan beide.
Een URL-omleiding omvat een bewerking aan de clientzijde, waarbij de client wordt geïnstrueerd om toegang te krijgen tot een resource op een ander adres dan de oorspronkelijk aangevraagde client. Hiervoor is een aanroep naar de server vereist. De omleidings-URL die naar de client wordt geretourneerd, wordt weergegeven in de adresbalk van de browser wanneer de client een nieuwe aanvraag voor de resource indient.
Als /resource wordt omgeleid naar /different-resource, reageert de server dat de client de resource /different-resource moet verkrijgen met een statuscode die aangeeft dat de omleiding tijdelijk of permanent is.
Wanneer u aanvragen omleidt naar een andere URL, geeft u aan of de omleiding permanent of tijdelijk is door de statuscode met het antwoord op te geven:
De
301 - Moved Permanentlystatuscode wordt gebruikt waar de resource een nieuwe, permanente URL heeft en u de client wilt instrueren dat alle toekomstige aanvragen voor de resource de nieuwe URL moeten gebruiken. De client kan het antwoord in de cache opslaan en opnieuw gebruiken wanneer er een 301-statuscode wordt ontvangen.De 302 - Gevonden statuscode wordt gebruikt waar de omleiding tijdelijk is of over het algemeen onderhevig is aan wijzigingen. De 302-statuscode geeft aan dat de client de URL niet hoeft op te slaan en in de toekomst te gebruiken.
Zie RFC 9110: Statuscodedefinities voor meer informatie over statuscodes.
Een URL rewrite is een bewerking aan de serverzijde die een resource levert van een ander resourceadres dan dat de client heeft opgevraagd. Voor het herschrijven van een URL is geen retour naar de server vereist. De herschreven URL wordt niet geretourneerd naar de client en wordt niet weergegeven in de adresbalk van de browser.
Als /resource wordt herschreven naar /different-resource, haalt de server intern de resource op en retourneert deze naar .
Hoewel de client de resource mogelijk kan ophalen op de herschreven URL, wordt de client niet geïnformeerd dat de resource bestaat op de herschreven URL wanneer deze de aanvraag indient en het antwoord ontvangt.
Voorbeeld-app voor het herschrijven van URL's
U kunt de functies van de URL-herkenningsmiddleware verkennen met de voorbeeld-app. De app past omleidings- en herschrijfregels toe en toont de omgeleide of herschreven URL voor verschillende scenario's.
Wanneer gebruikt u middleware voor het herschrijven van URL's
Gebruik MIDDLEWARE voor het herschrijven van URL's wanneer u de volgende methoden niet kunt gebruiken:
- URL-module herschrijven met IIS op Windows Server
- Apache mod_rewrite-module op de Apache-server
- URL-herschrijven op Nginx
Gebruik de middleware voor het herschrijven van URL's wanneer de app wordt gehost op HTTP.sys server.
De belangrijkste redenen om de technologieën voor het herschrijven van URL's op de server te gebruiken in IIS, Apache en Nginx zijn:
De middleware biedt geen ondersteuning voor de volledige functies van deze modules.
Sommige van de functies van de servermodules werken niet met ASP.NET Core-projecten, zoals de
IsFileenIsDirectorybeperkingen van de IIS-herschrijfmodule. Gebruik in deze scenario's in plaats daarvan de middleware.De prestaties van de middleware komen waarschijnlijk niet overeen met die van de modules.
Benchmarking is de enige manier om zeker te weten welke aanpak de prestaties het meest verslechtert of als verminderde prestaties verwaarloosbaar zijn.
Package
URL-herschrijven middleware wordt geleverd door het Microsoft.AspNetCore.Rewrite-pakket , dat impliciet is opgenomen in ASP.NET Core-apps.
Uitbreiding en opties
Stel regels voor het herschrijven en omleiden van URL's tot stand door een exemplaar van de klasse RewriteOptions te maken met extensiemethoden voor elk van uw herschrijfregels. Koppel meerdere regels in de volgorde waarin ze moeten worden verwerkt. De RewriteOptions waarden worden doorgegeven aan de URL-herschrijfmiddleware wanneer het met UseRewriter aan de verzoekpijplijn wordt toegevoegd.
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}"));
}
Non-www omleiden naar www
Met drie opties kan de app verzoeken die geen www betreffen omleiden naar www.
AddRedirectToWwwPermanent: Verzoek permanent omleiden naar het
wwwsubdomein als het verzoek niet-wwwis. Redirects met de statuscode Status308PermanentRedirect.AddRedirectToWww: De aanvraag omleiden naar het
wwwsubdomein als de binnenkomende aanvraag niet iswww. Omleidingen met een statuscode Status307TemporaryRedirect. Met een overbelasting kunt u de statuscode voor het antwoord opgeven. Gebruik een veld van de StatusCodes klasse voor een statuscodetoewijzing.
URL-doorverwijzing
Gebruik AddRedirect om aanvragen om te leiden. De eerste parameter bevat uw Regex voor vergelijking op het pad van de binnenkomende URL. De tweede parameter is de vervangende tekenreeks. De derde parameter, indien aanwezig, geeft de statuscode op. Als u de statuscode niet opgeeft, wordt de statuscode standaard ingesteld op 302 - Gevonden, wat aangeeft dat de resource tijdelijk wordt verplaatst of vervangen.
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}"));
}
In een browser waarvoor ontwikkelhulpprogramma's zijn ingeschakeld, moet u een aanvraag indienen bij de voorbeeld-app met het pad /redirect-rule/1234/5678. De regex komt overeen met het aanvraagpad op redirect-rule/(.*)en het pad wordt vervangen door /redirected/1234/5678. De omleidings-URL wordt teruggestuurd naar de client met een statuscode 302 - Gevonden . De browser doet een nieuwe aanvraag bij de omleidings-URL, die wordt weergegeven in de adresbalk van de browser. Omdat er geen regels in de voorbeeld-app overeenkomen met de omleidings-URL:
- De tweede aanvraag ontvangt een 200 - OK-antwoord van de app.
- In de hoofdtekst van het antwoord wordt de omleidings-URL weergegeven.
Er wordt een verbinding met de server gemaakt wanneer een URL wordt omgeleid.
Warning
Wees voorzichtig bij het opstellen van omleidingsregels. Omleidingsregels worden geëvalueerd op elke aanvraag naar de app, inclusief na een omleiding. Het is eenvoudig om per ongeluk een lus met oneindige omleidingen te maken.
Oorspronkelijke aanvraag: /redirect-rule/1234/5678
Het deel van de expressie tussen haakjes wordt een capture-groep genoemd. De punt (.) van de expressie betekent dat elk teken overeenkomt. Het sterretje (*) geeft aan dat het voorgaande teken nul of meer keren overeenkomt. Daarom worden de laatste twee padsegmenten van de URL, 1234/5678vastgelegd door de capture-groep (.*). Elke waarde die u opgeeft in de aanvraag-URL na redirect-rule/, wordt vastgelegd door deze enkele capture-groep.
In de vervangende tekenreeks worden vastgelegde groepen in de tekenreeks geïnjecteerd met het dollarteken ($) gevolgd door het volgnummer van de opname. De eerste waarde van de capturegroep wordt verkregen met $1, de tweede met $2, en ze worden in volgorde voortgezet voor de capturegroepen in je regex. Er is slechts één vastgelegde groep in de regex van de omleidingsregel in de voorbeeld-app, dus er is slechts één geïnjecteerde groep in de vervangende tekenreeks.$1 Wanneer de regel wordt toegepast, wordt de URL /redirected/1234/5678.
URL-omleiding naar een beveiligd eindpunt
Gebruik AddRedirectToHttps om HTTP-aanvragen om te leiden naar dezelfde host en hetzelfde pad via het HTTPS-protocol. Als de statuscode niet is opgegeven, wordt de middleware standaard ingesteld op 302 - Gevonden. Als de poort niet is opgegeven:
- De middleware wordt standaard ingesteld op
null. - Het schema wordt gewijzigd in
https(HTTPS-protocol) en de client heeft toegang tot de resource op poort 443.
In het volgende voorbeeld ziet u hoe u de statuscode 301 - Moved Permanently instelt op en de poort wijzigt in 5001.
public void Configure(IApplicationBuilder app)
{
var options = new RewriteOptions()
.AddRedirectToHttps(301, 5001);
app.UseRewriter(options);
}
Gebruik AddRedirectToHttpsPermanent om onveilige aanvragen om te leiden naar dezelfde host en hetzelfde pad met het beveiligde HTTPS-protocol op poort 443. De middleware stelt de statuscode in op 301 - Moved Permanently.
public void Configure(IApplicationBuilder app)
{
var options = new RewriteOptions()
.AddRedirectToHttpsPermanent();
app.UseRewriter(options);
}
Note
Wanneer u omleidt naar een beveiligd eindpunt zonder de vereiste voor aanvullende omleidingsregels, raden we u aan om Middleware voor HTTPS-omleiding te gebruiken. Zie het onderwerp HTTPS afdwingen voor meer informatie.
De voorbeeld-app kan laten zien hoe u deze kunt gebruiken AddRedirectToHttps of AddRedirectToHttpsPermanent. Voeg de extensiemethode toe aan de RewriteOptions. Een onveilige aanvraag indienen bij de app op elke URL. Sluit de beveiligingswaarschuwing van de browser dat het zelfondertekende certificaat niet is vertrouwd of maak een uitzondering om het certificaat te vertrouwen.
Oorspronkelijke aanvraag met behulp van AddRedirectToHttps(301, 5001): http://localhost:5000/secure
Oorspronkelijke aanvraag met behulp van AddRedirectToHttpsPermanent: http://localhost:5000/secure
URL rewrite
Hiermee AddRewrite maakt u een regel voor het herschrijven van URL's. De eerste parameter bevat de regex voor vergelijking op het binnenkomende URL-pad. De tweede parameter is de vervangende tekenreeks. De derde parameter, skipRemainingRules: {true|false}geeft aan bij de middleware of aanvullende herschrijfregels al dan niet moeten worden overgeslagen als de huidige regel wordt toegepast.
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}"));
}
Oorspronkelijke aanvraag: /rewrite-rule/1234/5678
Het carat (^) aan het begin van de expressie betekent dat overeenkomende waarden beginnen aan het begin van het URL-pad.
In het eerdere voorbeeld met de omleidingsregel redirect-rule/(.*) is er geen carat (^) aan het begin van de regexp. Daarom kunnen alle tekens voorafgaan aan redirect-rule/ het pad voor een geslaagde overeenkomst.
| Path | Match |
|---|---|
/redirect-rule/1234/5678 |
Yes |
/my-cool-redirect-rule/1234/5678 |
Yes |
/anotherredirect-rule/1234/5678 |
Yes |
De herschrijfregel, ^rewrite-rule/(\d+)/(\d+)komt alleen overeen met paden als ze beginnen met rewrite-rule/. In de volgende tabel ziet u het verschil in vergelijking.
| Path | Match |
|---|---|
/rewrite-rule/1234/5678 |
Yes |
/my-cool-rewrite-rule/1234/5678 |
No |
/anotherrewrite-rule/1234/5678 |
No |
Na het ^rewrite-rule/ gedeelte van de expressie zijn er twee capturegroepen. (\d+)/(\d+) De \d tekens komen overeen met een cijfer (getal). Het plusteken (+) betekent dat het overeenkomt met een of meer van het voorgaande teken. Daarom moet de URL een getal bevatten, gevolgd door een slash gevolgd door een ander getal. Deze capture-groepen worden opgenomen in de herschreven URL als $1 en $2. Met de herschrijfregelvervangingsreeks worden de vastgelegde groepen opgenomen in de querytekenreeks. Het aangevraagde pad van /rewrite-rule/1234/5678 wordt herschreven om de resource te verkrijgen op /rewritten?var1=1234&var2=5678. Als een querytekenreeks aanwezig is in de oorspronkelijke aanvraag, blijft deze behouden wanneer de URL wordt herschreven.
Er is geen retour naar de server om de resource te verkrijgen. Als de resource bestaat, wordt deze opgehaald en geretourneerd naar de client met een statuscode 200 - OK . Omdat de client niet wordt omgeleid, verandert de URL in de adresbalk van de browser niet. Clients kunnen niet detecteren dat er een URL-herschrijfbewerking is opgetreden op de server.
Note
Gebruik skipRemainingRules: true waar mogelijk, omdat het overeenkomen van regels rekenkundig intensief is en de reactietijd van apps verhoogt. Voor het snelste app-antwoord:
- Regels herschrijven van de meest frequent overeenkomende regel naar de minst vaak overeenkomende regel.
- Sla de verwerking van de resterende regels over wanneer er een overeenkomst plaatsvindt en er is geen aanvullende regelverwerking vereist.
Apache mod_rewrite
Apache mod_rewrite regels toepassen met AddApacheModRewrite. Zorg ervoor dat het regelsbestand is geïmplementeerd met de app. Zie Apache mod_rewrite voor meer informatie en voorbeelden van mod_rewrite regels.
Een StreamReader wordt gebruikt om de regels uit het ApacheModRewrite.txt-regelbestand te lezen.
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}"));
}
Met de voorbeeld-app worden aanvragen omgeleid van /apache-mod-rules-redirect/(.\*) naar /redirected?id=$1. De antwoordstatuscode is 302 - Gevonden.
# Rewrite path with additional sub directory
RewriteRule ^/apache-mod-rules-redirect/(.*) /redirected?id=$1 [L,R=302]
Oorspronkelijke aanvraag: /apache-mod-rules-redirect/1234
De middleware ondersteunt de volgende Apache mod_rewrite-servervariabelen:
- 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
Regels voor het hernoemen van URLs met de IIS-module
Als u dezelfde regelset wilt gebruiken die van toepassing is op de IIS-URL-herschrijfmodule, gebruikt u AddIISUrlRewrite. Zorg ervoor dat het regelsbestand is geïmplementeerd met de app. Richt de middleware niet om het web.config-bestand van de app te gebruiken bij uitvoering op Windows Server IIS. Met IIS moeten deze regels worden opgeslagen buiten het web.config-bestand van de app om conflicten met de IIS-herschrijfmodule te voorkomen. Zie voor meer informatie en voorbeelden van IIS URL herschrijvingsmoduleregels URL herschrijven module 2.0 gebruiken en URL herschrijven moduleconfiguratiereferentie.
A StreamReader wordt gebruikt om de regels uit het IISUrlRewrite.xml regelsbestand te lezen:
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}"));
}
De voorbeeld-app herschrijft aanvragen van /iis-rules-rewrite/(.*) naar /rewritten?id=$1. Het antwoord wordt verzonden naar de client met een statuscode 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>
Oorspronkelijke aanvraag: /iis-rules-rewrite/1234
Als u een actieve IIS-herschrijfmodule hebt met regels op serverniveau die op ongewenste manieren van invloed zijn op uw app, kunt u de IIS-herschrijfmodule voor een app uitschakelen. Zie IIS-modules uitschakelen voor meer informatie.
Niet-ondersteunde functies
De middleware biedt geen ondersteuning voor de volgende functies van iis-URL-herschrijfmodule:
- Regels voor uitgaand verkeer
- Aangepaste servervariabelen
- Wildcards
- LogRewrittenUrl
Ondersteunde servervariabelen
De middleware ondersteunt de volgende IIS-URL-herschrijfmoduleservervariabelen:
- 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
Ook kunt u een IFileProvider verkrijgen via een PhysicalFileProvider. Deze aanpak biedt mogelijk meer flexibiliteit voor de locatie van uw herschrijfregelsbestanden. Zorg ervoor dat uw herschrijfregelsbestanden worden geïmplementeerd op de server op het pad dat u opgeeft.
PhysicalFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());
Regel op basis van methode
Gebruik Add dit om uw eigen regellogica in een methode te implementeren.
Add stelt de RewriteContext bloot, waarmee de HttpContext beschikbaar wordt gesteld voor gebruik in uw methode. Met RewriteContext.Result wordt bepaald hoe extra pijplijnverwerking wordt verwerkt. Stel de waarde in op een van de RuleResult velden die in de volgende tabel worden beschreven.
| Contextresultaat herschrijven | Action |
|---|---|
RuleResult.ContinueRules (standaard) |
Ga door met het toepassen van regels. |
RuleResult.EndResponse |
Stop met het toepassen van regels en verzend het antwoord. |
RuleResult.SkipRemainingRules |
Stop met het toepassen van regels en verzend de context naar de volgende middleware. |
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}"));
}
De voorbeeld-app demonstreert een methode die aanvragen omleidt voor paden die eindigen op .xml. Als er een verzoek wordt gedaan naar /file.xml, wordt het verzoek omgeleid naar /xmlfiles/file.xml. De statuscode is ingesteld op 301 - Moved Permanently. Wanneer de browser een nieuwe aanvraag voor /xmlfiles/file.xml doet, levert Static File Middleware het bestand aan de client vanuit de map wwwroot/xmlfiles. Stel voor een omleiding expliciet de statuscode van het antwoord in. Anders wordt een 200 - OK-statuscode geretourneerd en vindt de omleiding niet plaats op de client.
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;
}
}
Deze benadering kan ook aanvragen herschrijven. De voorbeeld-app laat zien hoe u het pad herschrijft voor een tekstbestandsaanvraag om het file.txt tekstbestand uit de map wwwroot te verwerken. Static File Middleware dient het bestand op basis van het bijgewerkte aanvraagpad:
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";
}
}
Regel op basis van IRule
Gebruik Add dit om regellogica te gebruiken in een klasse waarmee de IRule interface wordt geïmplementeerd.
IRule biedt meer flexibiliteit ten opzichte van het gebruik van de methodegebaseerde regelbenadering. Uw implementatieklasse kan een constructor bevatten waarmee u parameters voor de ApplyRule methode kunt doorgeven.
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}"));
}
De waarden van de parameters in de voorbeeld-app voor de extension en de newPath worden gecontroleerd om aan verschillende voorwaarden te voldoen. De extension waarde moet een waarde bevatten en de waarde moet .png, .jpgof .gifzijn. Als de newPath waarde niet geldig is, wordt er een ArgumentException gegenereerd. Als er een verzoek wordt gedaan naar image.png, wordt het verzoek omgeleid naar /png-images/image.png. Als er een verzoek wordt gedaan naar image.jpg, wordt het verzoek omgeleid naar /jpg-images/image.jpg. De statuscode is ingesteld op 301 - Moved Permanentlyen de context.Result statuscode is ingesteld om de verwerking van regels te stoppen en het antwoord te verzenden.
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;
}
}
}
Oorspronkelijke aanvraag: /image.png
Oorspronkelijke aanvraag: /image.jpg
Regex-voorbeelden
| Goal | Regex-tekenreeks & Voorbeeld van overeenkomst |
Vervangende tekenreeks & Voorbeeld van uitvoer |
|---|---|---|
| Pad herschrijven naar querytekenreeks | ^path/(.*)/(.*)/path/abc/123 |
path?var1=$1&var2=$2/path?var1=abc&var2=123 |
| Verwijder trailing slash | (.*)/$/path/ |
$1/path |
| Afsluitende slash afdwingen | (.*[^/])$/path |
$1//path/ |
| Schrijf specifieke aanvragen niet opnieuw |
^(.*)(?<!\.axd)$ of ^(?!.*\.axd$)(.*)$Ja: /resource.htmNee: /resource.axd |
rewritten/$1/rewritten/resource.htm/resource.axd |
| URL-segmenten opnieuw rangschikken | path/(.*)/(.*)/(.*)path/1/2/3 |
path/$3/$2/$1path/3/2/1 |
| Een URL-segment vervangen | ^(.*)/segment2/(.*)/segment1/segment2/segment3 |
$1/replaced/$2/segment1/replaced/segment3 |
In dit document maakt u kennis met het herschrijven van URL's met instructies voor het gebruik van URL-herschrijven middleware in ASP.NET Core-apps.
URL-herschrijven is het wijzigen van aanvraag-URL's op basis van een of meer vooraf gedefinieerde regels. Bij het herschrijven van URL's wordt een abstractie gemaakt tussen resourcelocaties en hun adressen, zodat de locaties en adressen niet nauw zijn gekoppeld. URL-herschrijven is in verschillende scenario's waardevol voor:
- Verplaats of vervang serverresources tijdelijk of permanent en onderhoud stabiele locators voor deze resources.
- Aanvraagverwerking splitsen in verschillende apps of in verschillende gebieden van één app.
- URL-segmenten voor binnenkomende aanvragen verwijderen, toevoegen of opnieuw organiseren.
- Optimaliseer openbare URL's voor zoekmachineoptimalisatie (SEO).
- Hiermee staat u het gebruik van vriendelijke openbare URL's toe om bezoekers te helpen de geretourneerde inhoud te voorspellen bij het aanvragen van een bron.
- Onbeveiligde aanvragen omleiden naar beveiligde eindpunten.
- Hotlinking voorkomen, waarbij een externe site gebruikmaakt van een gehoste statische asset op een andere site door de asset te koppelen aan een eigen inhoud.
Note
Het herschrijven van URL's kan de prestaties van een app verminderen. Beperk waar mogelijk het aantal en de complexiteit van regels.
Voorbeeldcode bekijken of downloaden (hoe download je)
URL-omleiding en URL-herschrijven
Het verschil in formulering tussen URL-omleiding en URL-herschrijven is subtiel, maar heeft belangrijke gevolgen voor het leveren van resources aan clients. ASP.NET Core's URL Rewriting Middleware kan voldoen aan de behoefte aan beide.
Een URL-omleiding omvat een bewerking aan de clientzijde, waarbij de client wordt geïnstrueerd om toegang te krijgen tot een resource op een ander adres dan de oorspronkelijk aangevraagde client. Hiervoor is een aanroep naar de server vereist. De omleidings-URL die naar de client wordt geretourneerd, wordt weergegeven in de adresbalk van de browser wanneer de client een nieuwe aanvraag voor de resource indient.
Als /resource wordt omgeleid naar /different-resource, reageert de server dat de client de resource /different-resource moet verkrijgen met een statuscode die aangeeft dat de omleiding tijdelijk of permanent is.
Wanneer u aanvragen omleidt naar een andere URL, geeft u aan of de omleiding permanent of tijdelijk is door de statuscode met het antwoord op te geven:
De
301 - Moved Permanentlystatuscode wordt gebruikt waar de resource een nieuwe, permanente URL heeft en u de client wilt instrueren dat alle toekomstige aanvragen voor de resource de nieuwe URL moeten gebruiken. De client kan het antwoord in de cache opslaan en opnieuw gebruiken wanneer er een 301-statuscode wordt ontvangen.De 302 - Gevonden statuscode wordt gebruikt waar de omleiding tijdelijk is of over het algemeen onderhevig is aan wijzigingen. De 302-statuscode geeft aan dat de client de URL niet hoeft op te slaan en in de toekomst te gebruiken.
Zie RFC 9110: Statuscodedefinities voor meer informatie over statuscodes.
Een URL rewrite is een bewerking aan de serverzijde die een resource levert van een ander resourceadres dan dat de client heeft opgevraagd. Voor het herschrijven van een URL is geen retour naar de server vereist. De herschreven URL wordt niet geretourneerd naar de client en wordt niet weergegeven in de adresbalk van de browser.
Als /resource wordt herschreven naar /different-resource, haalt de server intern de resource op en retourneert deze naar .
Hoewel de client de resource mogelijk kan ophalen op de herschreven URL, wordt de client niet geïnformeerd dat de resource bestaat op de herschreven URL wanneer deze de aanvraag indient en het antwoord ontvangt.
Voorbeeld-app voor het herschrijven van URL's
U kunt de functies van de URL-herkenningsmiddleware verkennen met de voorbeeld-app. De app past omleidings- en herschrijfregels toe en toont de omgeleide of herschreven URL voor verschillende scenario's.
Wanneer gebruikt u middleware voor het herschrijven van URL's
Gebruik MIDDLEWARE voor het herschrijven van URL's wanneer u de volgende methoden niet kunt gebruiken:
- URL-module herschrijven met IIS op Windows Server
- Apache mod_rewrite-module op de Apache-server
- URL-herschrijven op Nginx
Gebruik ook de middleware wanneer de app wordt gehost op HTTP.sys server (voorheen WebListener genoemd).
De belangrijkste redenen om de technologieën voor het herschrijven van URL's op de server te gebruiken in IIS, Apache en Nginx zijn:
De middleware biedt geen ondersteuning voor de volledige functies van deze modules.
Sommige van de functies van de servermodules werken niet met ASP.NET Core-projecten, zoals de
IsFileenIsDirectorybeperkingen van de IIS-herschrijfmodule. Gebruik in deze scenario's in plaats daarvan de middleware.De prestaties van de middleware komen waarschijnlijk niet overeen met die van de modules.
Benchmarking is de enige manier om zeker te weten welke aanpak de prestaties het meest verslechtert of als verminderde prestaties verwaarloosbaar zijn.
Package
Als u de middleware in uw project wilt opnemen, voegt u een pakketverwijzing toe aan de Microsoft.AspNetCore.App metapackage in het projectbestand, dat het pakket Microsoft.AspNetCore.Rewrite bevat.
Wanneer u de Microsoft.AspNetCore.App metapackage niet gebruikt, voegt u een projectverwijzing toe aan het Microsoft.AspNetCore.Rewrite pakket.
Uitbreiding en opties
Stel regels voor het herschrijven en omleiden van URL's tot stand door een exemplaar van de klasse RewriteOptions te maken met extensiemethoden voor elk van uw herschrijfregels. Koppel meerdere regels in de volgorde waarin ze moeten worden verwerkt. De RewriteOptions waarden worden doorgegeven aan de URL-herschrijfmiddleware wanneer het met UseRewriter aan de verzoekpijplijn wordt toegevoegd.
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}"));
}
Non-www omleiden naar www
Met drie opties kan de app verzoeken die geen www betreffen omleiden naar www.
AddRedirectToWwwPermanent: Verzoek permanent omleiden naar het
wwwsubdomein als het verzoek niet-wwwis. Redirects met de statuscode Status308PermanentRedirect.AddRedirectToWww: De aanvraag omleiden naar het
wwwsubdomein als de binnenkomende aanvraag niet iswww. Omleidingen met een statuscode Status307TemporaryRedirect. Met een overbelasting kunt u de statuscode voor het antwoord opgeven. Gebruik een veld van de StatusCodes klasse voor een statuscodetoewijzing.
URL-doorverwijzing
Gebruik AddRedirect om aanvragen om te leiden. De eerste parameter bevat uw regex om overeen te komen met het pad van de binnenkomende URL. De tweede parameter is de vervangende tekenreeks. De derde parameter, indien aanwezig, geeft de statuscode op. Als u de statuscode niet opgeeft, wordt de statuscode standaard ingesteld op 302 - Gevonden, wat aangeeft dat de resource tijdelijk wordt verplaatst of vervangen.
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}"));
}
In een browser waarvoor ontwikkelhulpprogramma's zijn ingeschakeld, moet u een aanvraag indienen bij de voorbeeld-app met het pad /redirect-rule/1234/5678. De regex komt overeen met het aanvraagpad op redirect-rule/(.*)en het pad wordt vervangen door /redirected/1234/5678. De omleidings-URL wordt teruggestuurd naar de client met een statuscode 302 - Gevonden . De browser doet een nieuwe aanvraag bij de omleidings-URL, die wordt weergegeven in de adresbalk van de browser. Omdat er geen regels in de voorbeeld-app overeenkomen met de omleidings-URL:
- De tweede aanvraag ontvangt een 200 - OK-antwoord van de app.
- In de hoofdtekst van het antwoord wordt de omleidings-URL weergegeven.
Er wordt een verbinding met de server gemaakt wanneer een URL wordt omgeleid.
Warning
Wees voorzichtig bij het opstellen van omleidingsregels. Omleidingsregels worden geëvalueerd op elke aanvraag naar de app, inclusief na een omleiding. Het is eenvoudig om per ongeluk een lus met oneindige omleidingen te maken.
Oorspronkelijke aanvraag: /redirect-rule/1234/5678
Het deel van de expressie tussen haakjes wordt een capture-groep genoemd. De punt (.) van de expressie betekent dat elk teken overeenkomt. Het sterretje (*) geeft aan dat het voorgaande teken nul of meer keren overeenkomt. Daarom worden de laatste twee padsegmenten van de URL, 1234/5678vastgelegd door de capture-groep (.*). Elke waarde die u opgeeft in de aanvraag-URL na redirect-rule/, wordt vastgelegd door deze enkele capture-groep.
In de vervangende tekenreeks worden vastgelegde groepen in de tekenreeks geïnjecteerd met het dollarteken ($) gevolgd door het volgnummer van de opname. De eerste waarde van de capturegroep wordt verkregen met $1, de tweede met $2, en ze worden in volgorde voortgezet voor de capturegroepen in je regex. Er is slechts één vastgelegde groep in de regex van de omleidingsregel in de voorbeeld-app, dus er is slechts één geïnjecteerde groep in de vervangende tekenreeks.$1 Wanneer de regel wordt toegepast, wordt de URL /redirected/1234/5678.
URL-omleiding naar een beveiligd eindpunt
Gebruik AddRedirectToHttps om HTTP-aanvragen om te leiden naar dezelfde host en hetzelfde pad via het HTTPS-protocol. Als de statuscode niet is opgegeven, wordt de middleware standaard ingesteld op 302 - Gevonden. Als de poort niet is opgegeven:
- De middleware wordt standaard ingesteld op
null. - Het schema wordt gewijzigd in
https(HTTPS-protocol) en de client heeft toegang tot de resource op poort 443.
In het volgende voorbeeld ziet u hoe u de statuscode 301 - Moved Permanently instelt op en de poort wijzigt in 5001.
public void Configure(IApplicationBuilder app)
{
var options = new RewriteOptions()
.AddRedirectToHttps(301, 5001);
app.UseRewriter(options);
}
Gebruik AddRedirectToHttpsPermanent om onveilige aanvragen om te leiden naar dezelfde host en hetzelfde pad met het beveiligde HTTPS-protocol op poort 443. De middleware stelt de statuscode in op 301 - Moved Permanently.
public void Configure(IApplicationBuilder app)
{
var options = new RewriteOptions()
.AddRedirectToHttpsPermanent();
app.UseRewriter(options);
}
Note
Wanneer u omleidt naar een beveiligd eindpunt zonder de vereiste voor aanvullende omleidingsregels, raden we u aan om Middleware voor HTTPS-omleiding te gebruiken. Zie het onderwerp HTTPS afdwingen voor meer informatie.
De voorbeeld-app kan laten zien hoe u deze kunt gebruiken AddRedirectToHttps of AddRedirectToHttpsPermanent. Voeg de extensiemethode toe aan de RewriteOptions. Een onveilige aanvraag indienen bij de app op elke URL. Sluit de beveiligingswaarschuwing van de browser dat het zelfondertekende certificaat niet is vertrouwd of maak een uitzondering om het certificaat te vertrouwen.
Oorspronkelijke aanvraag met behulp van AddRedirectToHttps(301, 5001): http://localhost:5000/secure
Oorspronkelijke aanvraag met behulp van AddRedirectToHttpsPermanent: http://localhost:5000/secure
URL rewrite
Hiermee AddRewrite maakt u een regel voor het herschrijven van URL's. De eerste parameter bevat de regex voor vergelijking op het binnenkomende URL-pad. De tweede parameter is de vervangende tekenreeks. De derde parameter, skipRemainingRules: {true|false}geeft aan bij de middleware of aanvullende herschrijfregels al dan niet moeten worden overgeslagen als de huidige regel wordt toegepast.
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}"));
}
Oorspronkelijke aanvraag: /rewrite-rule/1234/5678
Het carat (^) aan het begin van de expressie betekent dat overeenkomende waarden beginnen aan het begin van het URL-pad.
In het eerdere voorbeeld met de omleidingsregel redirect-rule/(.*) is er geen carat (^) aan het begin van de regexp. Daarom kunnen alle tekens voorafgaan aan redirect-rule/ het pad voor een geslaagde overeenkomst.
| Path | Match |
|---|---|
/redirect-rule/1234/5678 |
Yes |
/my-cool-redirect-rule/1234/5678 |
Yes |
/anotherredirect-rule/1234/5678 |
Yes |
De herschrijfregel, ^rewrite-rule/(\d+)/(\d+)komt alleen overeen met paden als ze beginnen met rewrite-rule/. In de volgende tabel ziet u het verschil in vergelijking.
| Path | Match |
|---|---|
/rewrite-rule/1234/5678 |
Yes |
/my-cool-rewrite-rule/1234/5678 |
No |
/anotherrewrite-rule/1234/5678 |
No |
Na het ^rewrite-rule/ gedeelte van de expressie zijn er twee capturegroepen. (\d+)/(\d+) De \d tekens komen overeen met een cijfer (getal). Het plusteken (+) betekent dat het overeenkomt met een of meer van het voorgaande teken. Daarom moet de URL een getal bevatten, gevolgd door een slash gevolgd door een ander getal. Deze capture-groepen worden opgenomen in de herschreven URL als $1 en $2. Met de herschrijfregelvervangingsreeks worden de vastgelegde groepen opgenomen in de querytekenreeks. Het aangevraagde pad van /rewrite-rule/1234/5678 wordt herschreven om de resource te verkrijgen op /rewritten?var1=1234&var2=5678. Als een querytekenreeks aanwezig is in de oorspronkelijke aanvraag, blijft deze behouden wanneer de URL wordt herschreven.
Er is geen retour naar de server om de resource te verkrijgen. Als de resource bestaat, wordt deze opgehaald en geretourneerd naar de client met een statuscode 200 - OK . Omdat de client niet wordt omgeleid, verandert de URL in de adresbalk van de browser niet. Clients kunnen niet detecteren dat er een URL-herschrijfbewerking is opgetreden op de server.
Note
Gebruik skipRemainingRules: true waar mogelijk, omdat het overeenkomen van regels rekenkundig intensief is en de reactietijd van apps verhoogt. Voor het snelste app-antwoord:
- Regels herschrijven van de meest frequent overeenkomende regel naar de minst vaak overeenkomende regel.
- Sla de verwerking van de resterende regels over wanneer er een overeenkomst plaatsvindt en er is geen aanvullende regelverwerking vereist.
Apache mod_rewrite
Apache mod_rewrite regels toepassen met AddApacheModRewrite. Zorg ervoor dat het regelsbestand is geïmplementeerd met de app. Zie Apache mod_rewrite voor meer informatie en voorbeelden van mod_rewrite regels.
Een StreamReader wordt gebruikt om de regels uit het ApacheModRewrite.txt-regelbestand te lezen.
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}"));
}
Met de voorbeeld-app worden aanvragen omgeleid van /apache-mod-rules-redirect/(.\*) naar /redirected?id=$1. De antwoordstatuscode is 302 - Gevonden.
# Rewrite path with additional sub directory
RewriteRule ^/apache-mod-rules-redirect/(.*) /redirected?id=$1 [L,R=302]
Oorspronkelijke aanvraag: /apache-mod-rules-redirect/1234
De middleware ondersteunt de volgende Apache mod_rewrite-servervariabelen:
- 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
Regels voor het hernoemen van URLs met de IIS-module
Als u dezelfde regelset wilt gebruiken die van toepassing is op de IIS-URL-herschrijfmodule, gebruikt u AddIISUrlRewrite. Zorg ervoor dat het regelsbestand is geïmplementeerd met de app. Richt de middleware niet om het web.config-bestand van de app te gebruiken bij uitvoering op Windows Server IIS. Met IIS moeten deze regels worden opgeslagen buiten het web.config-bestand van de app om conflicten met de IIS-herschrijfmodule te voorkomen. Zie voor meer informatie en voorbeelden van IIS URL herschrijvingsmoduleregels URL herschrijven module 2.0 gebruiken en URL herschrijven moduleconfiguratiereferentie.
A StreamReader wordt gebruikt om de regels uit het IISUrlRewrite.xml regelsbestand te lezen:
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}"));
}
De voorbeeld-app herschrijft aanvragen van /iis-rules-rewrite/(.*) naar /rewritten?id=$1. Het antwoord wordt verzonden naar de client met een statuscode 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>
Oorspronkelijke aanvraag: /iis-rules-rewrite/1234
Als u een actieve IIS-herschrijfmodule hebt met regels op serverniveau die op ongewenste manieren van invloed zijn op uw app, kunt u de IIS-herschrijfmodule voor een app uitschakelen. Zie IIS-modules uitschakelen voor meer informatie.
Niet-ondersteunde functies
De middleware die is uitgebracht met ASP.NET Core 2.x biedt geen ondersteuning voor de volgende iis-URL-herschrijfmodulefuncties:
- Regels voor uitgaand verkeer
- Aangepaste servervariabelen
- Wildcards
- LogRewrittenUrl
Ondersteunde servervariabelen
De middleware ondersteunt de volgende IIS-URL-herschrijfmoduleservervariabelen:
- 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
Ook kunt u een IFileProvider verkrijgen via een PhysicalFileProvider. Deze aanpak biedt mogelijk meer flexibiliteit voor de locatie van uw herschrijfregelsbestanden. Zorg ervoor dat uw herschrijfregelsbestanden worden geïmplementeerd op de server op het pad dat u opgeeft.
PhysicalFileProvider fileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());
Regel op basis van methode
Gebruik Add dit om uw eigen regellogica in een methode te implementeren.
Add stelt de RewriteContext bloot, waarmee de HttpContext beschikbaar wordt gesteld voor gebruik in uw methode. Met RewriteContext.Result wordt bepaald hoe extra pijplijnverwerking wordt verwerkt. Stel de waarde in op een van de RuleResult velden die in de volgende tabel worden beschreven.
| Contextresultaat herschrijven | Action |
|---|---|
RuleResult.ContinueRules (standaard) |
Ga door met het toepassen van regels. |
RuleResult.EndResponse |
Stop met het toepassen van regels en verzend het antwoord. |
RuleResult.SkipRemainingRules |
Stop met het toepassen van regels en verzend de context naar de volgende middleware. |
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}"));
}
De voorbeeld-app demonstreert een methode die aanvragen omleidt voor paden die eindigen op .xml. Als er een verzoek wordt gedaan naar /file.xml, wordt het verzoek omgeleid naar /xmlfiles/file.xml. De statuscode is ingesteld op 301 - Moved Permanently. Wanneer de browser een nieuwe aanvraag voor /xmlfiles/file.xml doet, levert Static File Middleware het bestand aan de client vanuit de map wwwroot/xmlfiles. Stel voor een omleiding expliciet de statuscode van het antwoord in. Anders wordt een 200 - OK-statuscode geretourneerd en vindt de omleiding niet plaats op de client.
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;
}
}
Deze benadering kan ook aanvragen herschrijven. De voorbeeld-app laat zien hoe u het pad herschrijft voor een tekstbestandsaanvraag om het file.txt tekstbestand uit de map wwwroot te verwerken. Static File Middleware dient het bestand op basis van het bijgewerkte aanvraagpad:
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";
}
}
Regel op basis van IRule
Gebruik Add dit om regellogica te gebruiken in een klasse waarmee de IRule interface wordt geïmplementeerd.
IRule biedt meer flexibiliteit ten opzichte van het gebruik van de methodegebaseerde regelbenadering. Uw implementatieklasse kan een constructor bevatten waarmee u parameters voor de ApplyRule methode kunt doorgeven.
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}"));
}
De waarden van de parameters in de voorbeeld-app voor de extension en de newPath worden gecontroleerd om aan verschillende voorwaarden te voldoen. De extension waarde moet een waarde bevatten en de waarde moet .png, .jpgof .gifzijn. Als de newPath waarde niet geldig is, wordt er een ArgumentException gegenereerd. Als er een verzoek wordt gedaan naar image.png, wordt het verzoek omgeleid naar /png-images/image.png. Als er een verzoek wordt gedaan naar image.jpg, wordt het verzoek omgeleid naar /jpg-images/image.jpg. De statuscode is ingesteld op 301 - Moved Permanentlyen de context.Result statuscode is ingesteld om de verwerking van regels te stoppen en het antwoord te verzenden.
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;
}
}
}
Oorspronkelijke aanvraag: /image.png
Oorspronkelijke aanvraag: /image.jpg
Regex-voorbeelden
| Goal | Regex-tekenreeks & Voorbeeld van overeenkomst |
Vervangende tekenreeks & Voorbeeld van uitvoer |
|---|---|---|
| Pad herschrijven naar querytekenreeks | ^path/(.*)/(.*)/path/abc/123 |
path?var1=$1&var2=$2/path?var1=abc&var2=123 |
| Verwijder trailing slash | (.*)/$/path/ |
$1/path |
| Afsluitende slash afdwingen | (.*[^/])$/path |
$1//path/ |
| Schrijf specifieke aanvragen niet opnieuw |
^(.*)(?<!\.axd)$ of ^(?!.*\.axd$)(.*)$Ja: /resource.htmNee: /resource.axd |
rewritten/$1/rewritten/resource.htm/resource.axd |
| URL-segmenten opnieuw rangschikken | path/(.*)/(.*)/(.*)path/1/2/3 |
path/$3/$2/$1path/3/2/1 |
| Een URL-segment vervangen | ^(.*)/segment2/(.*)/segment1/segment2/segment3 |
$1/replaced/$2/segment1/replaced/segment3 |
Aanvullende bronnen
- Voorbeeldcode bekijken of downloaden (hoe download je)
-
RewriteMiddleware(referentiebron) - app opstarten in ASP.NET Core
- ASP.NET Core Middleware
- Reguliere expressies in .NET
- Reguliere expressietaal - snelzoekgids
- Apache mod_rewrite
- Url herschrijven module 2.0 gebruiken (voor IIS)
- Configuratiereferentie voor URL Rewrite Module
- Een eenvoudige URL-structuur behouden
- 10 Tips en trucs voor het herschrijven van URL's
- Wel of niet slashen?