MVC核心:错误的链接URL,但不带斜杠

时间:2018-09-05 09:22:55

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

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

https://hostname/subfolder1/subfolder2 /

但是当我在不带斜杠(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?但是最佳做法是什么?

2 个答案:

答案 0 :(得分:0)

您可以将routeOptions配置为AppendTrailingSlash或将其删除。参见下面的示例

services.Configure<RouteOptions>(options => options.AppendTrailingSlash = true);

答案 1 :(得分:0)

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

  1. 末尾带有斜杠的基本URL被解释为目录,因此具有指向link1之类的链接将被解释为位于该目录的之下。

  2. 末尾没有斜杠,基本URL被解释为文件,因此指向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>

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

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

URL不支持~/的构造,但是Razor理解这是对文档根目录的引用,并且将在渲染视图以响应时解析并替换正确的URL。