.NET 6 WebAPI含%C2%A0的错误URL返回404,求解决方法
解决带/%C2%A0的错误URL跳转问题(.NET 6 WebAPI)
核心问题说明
URL末尾的%C2%A0是**非断空格(Unicode U+00A0)**的URL编码,ASP.NET Core路由默认会自动解码URL,所以直接用%C2%A0定义路由无法匹配,需要针对解码后的字符处理。
方案一:使用Unicode转义字符匹配路由
直接在路由中用Unicode转义\u00A0表示非断空格,匹配解码后的请求路径:
[HttpGet] [Route("\u00A0")] public async Task<IActionResult> RedirectFromInvalidUrl() { // 重定向到正确页面(替换为你的目标路径) return RedirectPermanent("/正确的调查页面路径"); }
注意:要确保这个方法的签名和现有无参数
Get()方法区分开(比如方法名不同),避免路由冲突。
方案二:用中间件全局捕获并跳转(推荐)
中间件在请求管道最前端执行,不受路由规则限制,适合处理这种特殊URL场景:
- 创建自定义中间件类:
public class InvalidUrlRedirectMiddleware { private readonly RequestDelegate _next; public InvalidUrlRedirectMiddleware(RequestDelegate next) { _next = next; } public async Task Invoke(HttpContext context) { var requestPath = context.Request.Path.Value; // 判断解码后的路径是否为非断空格 if (requestPath.Equals("/\u00A0", StringComparison.Ordinal)) { // 301永久重定向到正确页面 context.Response.Redirect("/正确的调查页面路径", permanent: true); return; } await _next(context); } }
- 在
Program.cs中注册中间件(必须放在UseRouting之前):
var app = builder.Build(); // 注册自定义重定向中间件 app.UseMiddleware<InvalidUrlRedirectMiddleware>(); app.UseRouting(); app.UseAuthorization(); app.MapControllers(); app.Run();
方案三:IIS URL重写规则(服务器层面处理)
如果希望在IIS层解决问题,需安装URL Rewrite模块,然后在web.config中添加重写规则:
<configuration> <system.webServer> <rewrite> <rules> <rule name="Redirect Invalid Space URL" stopProcessing="true"> <!-- 匹配原始URL编码后的路径 --> <match url="^%C2%A0$" /> <!-- 重定向到正确页面 --> <action type="Redirect" url="/正确的调查页面路径" redirectType="Permanent" /> </rule> </rules> </rewrite> </system.webServer> </configuration>
测试注意事项
- 测试时直接使用邮件中的错误URL,不要手动输入空格(手动输入的通常是普通空格U+0020,和目标非断空格不匹配)。
- 优先选择中间件方案,兼容性更强,不受路由配置限制。
内容的提问来源于stack exchange,提问作者Fraser Orr
相关产品推荐
相关产品推荐

