asp.net-mvc - MVC Core:没有斜杠的错误链接 url
问题描述
我开发了一个部署在 iis 下的 mvc core 2.1 web-app。但是我的路由引擎有问题。一切正常,当我用这个网址调用网站时:
但是当我调用没有斜杠(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?但是最好的做法是什么?
解决方案
问题是您使用的是相对 URL,并且基于基本 URL 末尾是否存在斜杠,它们的处理方式将有所不同。
末尾有一个斜线,基本 URL 被解释为一个目录,因此有一个指向类似内容的链接
link1
将被解释为位于该目录下。如果末尾没有斜杠,则基本 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,因为它为响应呈现您的视图。
推荐阅读
- c - 如何在函数中将指针作为参数传递?
- node.js - 在 Visual Studio Code 中,如何在 launch.json 中传递参数
- json - JSON 数组格式,无列名
- bash - 如何在 GitHub 操作中推送 nuget 包
- image - OpenCV 和 Matlab 之间的像素值略有不同
- java - 如何序列化 java.security.Principal?
- flutter - 颤振构建:构建失败
- python - 在python中实例化和继承多个类
- javascript - el-table 中的自定义列标题不响应
- node.js - fetch api 无法访问 nodejs + express url