如何将IIS移除URL末尾斜杠的重写规则转换为ASP.NET Core实现
将IIS移除末尾斜杠的重写规则转换为ASP.NET Core实现
当然可以将这条IIS规则转换为ASP.NET Core的RewriteOptions实现,以下是完全匹配原规则逻辑的两种方案:
方案一:使用内置AddRedirect方法
这种方式简洁直接,利用框架内置的重定向方法实现需求:
using Microsoft.AspNetCore.Rewrite; using Microsoft.AspNetCore.Http; public void Configure(IApplicationBuilder app) { var rewriteOptions = new RewriteOptions() // 匹配末尾带斜杠的URL,排除存在的文件/目录,返回临时重定向 .AddRedirect( regex: @"(.*)/$", replacement: "$1", statusCode: StatusCodes.Status302Found, conditions: context => !context.FileProvider.GetFileInfo(context.HttpContext.Request.Path).Exists && !context.FileProvider.GetDirectoryContents(context.HttpContext.Request.Path).Exists ); app.UseRewriter(rewriteOptions); // 此处添加其他中间件(如UseRouting、UseEndpoints等) }
对应原IIS规则的逻辑映射:
@"(.*)/$"→ 对应<match url="(.*)/$" />,匹配所有末尾带斜杠的路径replacement: "$1"→ 对应url="{R:1}",用捕获的内容去掉末尾斜杠StatusCodes.Status302Found→ 对应redirectType="Temporary",返回临时重定向(302)- 条件部分 → 对应原规则的两个
<conditions>,确保仅对不存在的文件/目录路径执行重定向
方案二:自定义规则(精准匹配stopProcessing="true"逻辑)
如果需要完全对应原规则的stopProcessing="true"(执行重定向后跳过剩余规则),可以使用自定义规则:
using Microsoft.AspNetCore.Rewrite; using Microsoft.AspNetCore.Http; using System.Text.RegularExpressions; public void Configure(IApplicationBuilder app) { var rewriteOptions = new RewriteOptions(); rewriteOptions.Add(context => { var request = context.HttpContext.Request; var path = request.Path.Value; // 匹配末尾带斜杠的路径 if (Regex.IsMatch(path, @"(.*)/$")) { // 检查请求路径是否为存在的文件或目录 var fileExists = context.FileProvider.GetFileInfo(path).Exists; var dirExists = context.FileProvider.GetDirectoryContents(path).Exists; if (!fileExists && !dirExists) { // 构造去掉斜杠的完整URL(保留查询字符串) var newPath = path.TrimEnd('/'); var newUrl = $"{request.Scheme}://{request.Host}{newPath}{request.QueryString}"; // 执行临时重定向 context.HttpContext.Response.Redirect(newUrl, permanent: false); // 跳过剩余所有重写规则,对应stopProcessing="true" context.Result = RuleResult.SkipRemainingRules; } } }); app.UseRewriter(rewriteOptions); // 此处添加其他中间件(如UseRouting、UseEndpoints等) }
额外说明:
- 两种方案都保留了原规则的核心逻辑:仅对非文件、非目录的末尾带斜杠路径执行临时重定向
- 注意将重写中间件
UseRewriter放在路由、端点等中间件之前,确保重定向逻辑优先执行
内容的提问来源于stack exchange,提问作者Jakob Bagterp
相关产品推荐
相关产品推荐

