当url响应状态代码为400时,如何使用C#.Net Core 5 Blazor服务器端应用程序中的中间件重定向到主页



我试图访问一个返回400状态代码的页面,然后通过中间件将用户重定向到主页。下面是一个将抛出400的示例url:https://testsite.com/%C3%85%C2%81%C3%83%C2%B3d%C3%85%C2%BA_Voivodeship

注意在"/%C3%85%C2%81%C3%83%C2%B3d%C3%85%C2%BA_;对于blazor服务器端app/.netmvc应用程序上的请求,将抛出一个400错误。

提到的url与许多其他返回400状态代码的url一起出现在网站地图中。在实际有用的上下文中,仅仅从网站地图中删除URL是不够的,因为搜索引擎已经读取了它们,并将继续请求它们。在这个SEO关注的问题之上,有一个明显的,但不幸的是没有提到足够多的,极其糟糕的用户体验提供了一个"错误的请求-无效的URLHTTP错误400。请求URL无效"任何面向用户的应用程序的错误消息。这只会让用户陷入困境。

因此,当被要求时,这个问题确实需要处理,以便将用户正确地纠正到他们可以做某事的位置,并帮助抓取网站的搜索引擎通过重定向强烈指示不应该再抓取特定的url(是的,对于那些不了解技术SEO的人来说,这是处理这种情况的正确、最佳实践方法)。

我试图通过在Startup.cs的Configure方法中放置一个app.use来实现这一点,但如果你使用如上所述的url,它永远不会真正命中代码。我能够打破;然而,对于任何像200状态码一这样的普通请求。因此,这似乎不是正确的做法。有什么想法吗?

app.Use(async (context, next) =>
{
var statusCode = context.Response.StatusCode;
// Redirect to homepage of site when 400 status code
if (statusCode == 400)
{
context.Response.Redirect("/");
return;   // short circuit
}
await next();
});

HTTP状态代码400和相应的消息由HTTP.SYS生成。HTTP.SYS执行URL验证并可以拒绝请求。在这种情况下,返回的网页看起来像

错误的请求-无效的URL


HTTP错误400。请求URL无效。

由于HTTP.SYS阻止了指定的URL,因此请求永远不会到达应用程序。有关其他详细信息,请参阅URL中的类似问题%09导致IIS(HTTP.SYS?)立即返回HTTP 400。在当前情况下,HTTP.SYS不喜欢%81、%83和%85个字符。相应的消息可以在位于%SystemRoot%System32LogFilesHTTPERR的HTTP.SYS日志中找到。

如果由于某种原因无法更改URL,HTTP.SYS行为可以通过位于HKEY_LOCAL_MACHINESystemCurrentControlSetServicesHTTPParameters下的AllowRestrictedCharsDWORD注册表项进行配置,如Windows文章的HTTP.SYS注册表设置中所述。

如果非零,Http.sys接受请求URL中的十六进制转义字符,这些字符解码到U+0000-U+001F和U+007F-U+009F范围。

必须重新启动HTTP服务,更改才能生效。

除了HTTP.SYS配置更改之外,中间件代码还需要一些改进。next委托的执行需要移动到方法的最顶部。

app.Use(
async (context, next) =>
{
await next();
if (context.Response.StatusCode == 400)
{
context.Response.Redirect("/");
}
});

此外,正如评论中所提到的,中间件的位置很重要。HttpResponse.Redirect方法只是将HTTP状态代码设置为301302,并指定Location标头。如果其他中间件或应用程序代码已经向客户端发送了响应,则HttpResponse.Redirect方法将抛出异常。