首页 > 解决方案 > MVC Core:没有斜杠的错误链接 url

问题描述

我开发了一个部署在 iis 下的 mvc core 2.1 web-app。但是我的路由引擎有问题。一切正常,当我用这个网址调用网站时:

https://主机名/子文件夹1/子文件夹2 /

但是当我调用没有斜杠(https://hostname/subfolder1/subfolder2)的网站时,我在主页上的链接不起作用,因为它们指向了错误的 url。正确的网址是:https://hostname/subfolder1/subfolder2/link1?param=HelloWorld

如果我在没有尾部斜杠的情况下调用主页,则链接如下所示: https://hostname/subfolder1/link1?param=HelloWorld

所以缺少一个子文件夹。

我的路线是:

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Portal}/{action=Index}/{id?}"
            );
        });

这是我认为的相关代码:

<a class="app-tile" href="@app.Url" title="@app.Description" >

其中@app.Url 看起来像“./link1?param=HelloWorld”

那么我必须做些什么才能使用这两个网址(带有和不带有斜杠)?

也许将所有不带斜线的请求重定向到带斜线的url?但是最好的做法是什么?

标签: asp.net-mvcasp.net-core

解决方案


问题是您使用的是相对 URL,并且基于基本 URL 末尾是否存在斜杠,它们的处理方式将有所不同。

  1. 末尾有一个斜线,基本 URL 被解释为一个目录,因此有一个指向类似内容的链接link1将被解释为位于该目录下。

  2. 如果末尾没有斜杠,则基本 URL 被解释为file,因此指向类似link1, 的链接将被解释为同一目录中的同级,即路径带有斜杠的部分。

这与您的应用程序无关,具体而言,它是所有浏览器处理相对 URL 的方式。解决方法是对链接、图像、脚本等使用相对绝对 URL。基本上,这意味着您从文档根级别引用所有内容,并带有前面的斜杠。所以,而不是类似的东西:

<a href="link1">Link 1</a>

改用:

<a href="/subfolder1/subfolder2/link1">

通过这种方式,您消除了关于应如何连接基本 URL 和链接 URL 路径的歧义,并且无论是否存在尾部斜杠,它始终是一个好的 URL。

就 ASP.NET Core 而言,如果您使用内置的 URL 生成功能,它将为您处理诸如虚拟路径之类的附加内容,例如链接的开头。例如,如果您的站点托管在您的域下的虚拟目录中/subfolder1,那么当您执行以下操作时:

<a asp-action="Link1Action" asp-controller="Subfolder2">Link 1</a>

然后生成的 href 属性将是正确的/subfolder1/subfolder2/link1.

您也可以使用Url.Content,它将映射到您网站的文档根目录:

<a href="@Url.Content("~/subfolder2/link1")">Link 1</a>

然后,假设您的 root 是http://hostname/subfolder1,它将再次创建您需要的正确 URL。在 Razor 视图中,您还可以将其简写为:

<a href="~/subfolder2/link1`>Link 1</a>

URL 不支持该~/构造,但 Razor 将其理解为对文档根目录的引用,并将解析并替换正确的 URL,因为它为响应呈现您的视图。


推荐阅读