如何让Asp.Net Core路由引擎严格遵守指定的路由?

Ron*_*n C 5 url seo routes asp.net-core

背景
出于 SEO 目的,同一页面不能有两个 url 很重要,否则 Google 会将其中一个页面视为具有“重复内容”,这将导致 Google 降低该页面在搜索引擎结果中的排名。

问题
在 Asp.Net Core 中,当使用基于属性的例程时,如下所示:

 public class ExampleController: Controller {

    [HttpGet]
    [Route("/example/")]
    public IActionResult Index() {
        return View();
    }     

} 
Run Code Online (Sandbox Code Playgroud)

此路由返回 index.cshtml 页面,以响应/example/ AND /example的 url 请求。但是,我只希望它响应我明确指定的路线,即/example/. 如果由于我不希望此操作方法响应而收到请求/example,则系统应该返回 404。

问题
我需要在全局级别做什么来强制路由引擎严格遵守指定的路由?

Ron*_*n C 3

我不知道为什么有人对这个问题投了反对票,我只能猜测他们不了解问题的严重性。也许他们不了解搜索引擎优化的重要性。使用 Asp.Net Core 框架研究这个问题花了很多时间,因此我在这里分享这项工作以帮助其他人。

事实证明,这个问题已在 GitHub 存储库中报告,并且正在考虑将来修复。显然,Asp.Net Core 表现出这种错误行为的主要原因是 MVC 的早期版本。去搞清楚。

目前还没有办法强制 Asp.Net Core 路由引擎严格匹配声明的路由。事实上,当声明基于属性的路由时,/example/它会内部存储在路由数据结构中,/example这表明这个问题的严重程度。非常不幸的是,数据以这种方式存储,使得路由引擎无法辨别它们之间的差异/example/example/严格来说它们是两个不同的端点。

解决该问题
由于我迫不及待地等待修复,因此我必须实施解决方案。我解决这个问题的方法是实现在管道早期运行的中间件,检查所有传入请求,以确保 url 仅以斜杠结尾(如果它指定了目录路径),此中间件还要求任何以 a 结尾的路径目录必须以斜杠结尾。如果请求的 URL 不符合这些规则,它会使用 301 重定向到正确的 URL。

例如,给出以下内容:

/somefile.cshtml
/somedir/anotherdir/file.cshtml
/somedir/anotherdir/index.cshtml

请求/somefile/被重定向到/somefile请求被/somedir/anotherdir/file/重定向到/somedir/anotherdir/file请求/somedir/anotherdir被重定向到/somedir/anotherdir/

此方法解决了默认路由引擎将和视为同一路由所固有的重复内容问题。该方法通过确保只有其中一个到达路由引擎来实现这一点。/somedir/somedir/

我应该补充一点,虽然这种解决方案在某种意义上“解决”了问题,但它的效率远不如拥有一个可以被告知严格遵守指定路由的路由引擎。希望我们在 2.0 版本中能够有这样的路由选项。