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?但是最佳做法是什么?
答案 0 :(得分:0)
您可以将routeOptions配置为AppendTrailingSlash或将其删除。参见下面的示例
services.Configure<RouteOptions>(options => options.AppendTrailingSlash = true);
答案 1 :(得分:0)
问题是您使用的是相对URL,并且根据基本URL末尾是否存在斜杠,它们的处理方式将有所不同。
末尾带有斜杠的基本URL被解释为目录,因此具有指向link1
之类的链接将被解释为位于该目录的之下。
末尾没有斜杠,基本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。