.NET Core中移除URL末尾单个斜杠失败,现有代码仅支持多斜杠
你当前的代码问题在于:只有当路径需要转换为小写时才会执行重定向。如果路径已经是小写,哪怕你移除了末尾的单个斜杠,也不会触发跳转,所以单个斜杠的URL始终保持不变。
修复方案一:合并路径处理逻辑
修改自定义重写规则,先处理斜杠移除和小写转换,只要路径有变化就执行重定向(不管是因为斜杠还是大小写):
var rewriteOptions = new RewriteOptions() .Add(ctx => { var request = ctx.HttpContext.Request; var originalPath = request.Path.Value; var processedPath = originalPath; // 移除末尾单个/或多个/(排除根路径/) if (processedPath.Length > 1 && processedPath.EndsWith("/")) { processedPath = processedPath.TrimEnd('/'); } // 转换为小写 processedPath = processedPath.ToLowerInvariant(); // 只要处理后的路径和原始路径不同,就触发重定向 if (processedPath != originalPath) { var newUrl = $"{processedPath}{request.QueryString}"; ctx.HttpContext.Response.Redirect(newUrl, permanent: true); } }); application.UseRewriter(rewriteOptions); application.UseResponseCaching();
这里TrimEnd('/')会自动处理单个或多个末尾斜杠,所以原来的多斜杠重定向规则可以去掉,避免重复处理。
修复方案二:单独添加单个斜杠重定向规则
如果你想保留原有逻辑,也可以单独添加一条正则重定向规则来处理末尾单个斜杠的情况:
var rewriteOptions = new RewriteOptions() // 处理末尾单个斜杠(排除根路径/) .AddRedirect(@"^(.*[^/])/$", "$1", permanent: true) // 处理多斜杠 .AddRedirect(@"^(.*?)/{2,}$", "$1", permanent: true) .Add(ctx => { var request = ctx.HttpContext.Request; var path = request.Path.Value; // 仅处理大小写转换的重定向 if (path.ToLowerInvariant() != path) { var newPath = path.ToLowerInvariant(); var newUrl = $"{newPath}{request.QueryString}"; ctx.HttpContext.Response.Redirect(newUrl, permanent: true); } }); application.UseRewriter(rewriteOptions); application.UseResponseCaching();
正则^(.*[^/])/$的作用是匹配所有末尾带单个斜杠且路径不是根路径的URL,将其重定向到去掉斜杠的版本。
注意事项
- 确保
UseRewriter在UseResponseCaching之前调用,避免缓存未重定向的旧响应。 - 重定向使用
permanent: true(301重定向),有利于搜索引擎更新索引,符合SEO规范。
内容的提问来源于stack exchange,提问作者confusedMind
相关产品推荐
相关产品推荐

