MVC核心:错误的链接URL没有斜杠

问题描述 投票:0回答:2

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

https://hostname/subfolder1/subfolder2 /

但是当我在没有尾随斜线(https://hostname/subfolder1/subfolder2)的情况下调用网站时,主页上的链接无法正常工作,因为它们指向了错误的网址。正确的网址是: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”

那么我需要做些什么才能使用两个网址(有和没有斜线)?

也许重定向所有请求没有斜线到斜杠的网址?但这样做的最佳做法是什么?

asp.net-mvc asp.net-core
2个回答
0
投票

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

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

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>

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.