如何在 URL 中的某些后缀上引发 HTTP404?
How to raise HTTP404 on certain suffix in URL?
当 url 被 /
终止时,我想提出 HTTP404 Not Found 问题,例如 www.abc.com/hubbahubba/
。不知道是应该在路由中定义还是应该由中间件来完成?
我正在考虑这样做:
routes.MapRoute( _
name:="CatchTrailingSlash",
url:="*+/",
defaults:=New With {.controller = "Error", .action = "Handler"}
)
但这意味着我需要为其创建专用控制器。正确的做法是什么?
您可以使用中间件:
app.Use(async (context, next) =>
{
if (context.Request.GetDisplayUrl().EndsWith("/"))
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
return;
}
await next.Invoke();
});
或使用操作过滤器:
using Microsoft.AspNetCore.Http.Extensions;
public class GlobalFilter: IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
var result = context.HttpContext.Request.GetDisplayUrl().EndsWith("/");
if (result)
{
context.Result = new NotFoundResult();
return;
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
}
全球注册:
services.AddMvc(config =>
{
config.Filters.Add(new GlobalFilter());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
当 url 被 /
终止时,我想提出 HTTP404 Not Found 问题,例如 www.abc.com/hubbahubba/
。不知道是应该在路由中定义还是应该由中间件来完成?
我正在考虑这样做:
routes.MapRoute( _
name:="CatchTrailingSlash",
url:="*+/",
defaults:=New With {.controller = "Error", .action = "Handler"}
)
但这意味着我需要为其创建专用控制器。正确的做法是什么?
您可以使用中间件:
app.Use(async (context, next) =>
{
if (context.Request.GetDisplayUrl().EndsWith("/"))
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
return;
}
await next.Invoke();
});
或使用操作过滤器:
using Microsoft.AspNetCore.Http.Extensions;
public class GlobalFilter: IActionFilter
{
public void OnActionExecuting(ActionExecutingContext context)
{
var result = context.HttpContext.Request.GetDisplayUrl().EndsWith("/");
if (result)
{
context.Result = new NotFoundResult();
return;
}
}
public void OnActionExecuted(ActionExecutedContext context)
{
}
}
全球注册:
services.AddMvc(config =>
{
config.Filters.Add(new GlobalFilter());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);