我正在开发一个 ASP.NET Core Razor 页面项目,其中的 URL 包含区域性代码和 slug,并以斜杠分隔 (
/
)。这种结构有助于识别内容的不同语言版本。例如,课程 URL 可能如下所示:
https://localhost:7213/CourseDetails/en/learn-english-in-99-days
在数据库中,我将这些 slugs 存储为格式为
culture/slug
的单个字符串,例如:
en/learn-english-in-99-days
prs/learn-farsi-in-30-days
但是,当我尝试在 URL 中传递此 slug 时,它通常会在某些条件下被 URL 编码为
%2F
或解码为空格。即使我用斜线(/
)传递slug,也会发生这种情况,而且看起来不一致。
示例问题
在数据库中,我将 slug 存储为
en/learn-english-in-99-days
。
当我像这样导航到浏览器中的 URL 时:
https://localhost:7213/CourseDetails/en%2Flearn-english-in-99-days
浏览器将
%2F
转换为斜杠,从而产生以下 URL:
https://localhost:7213/CourseDetails/en/learn-english-in-99-days
当 ASP.NET Core 处理请求时,转换后的 URL(使用
/
而不是 %2F
)与数据库中存储的 slug 不匹配。这会导致问题,例如找不到课程并返回 404 错误。
我尝试过的
自定义中间件:我尝试创建中间件来将请求路径中的
%2F
替换为/
,但这仍然会导致浏览器用斜杠显示解码路径时出现问题。
手动编码和解码:我在 Razor 页面的
Uri.UnescapeDataString
处理程序中使用 OnGet
来解码 ID,但仍然无法完全解决问题,因为编码和解码看起来不一致。
问题
为什么斜杠 (
/
) 会转换为 %2F
或者有时是空格,即使它作为常规斜杠存储在数据库中也是如此?如何保持正确的编码/解码,使 URL 与数据库中存储的格式匹配,从而允许我检索正确的资源?
环境
https://localhost
任何关于如何处理 ASP.NET Core 中带有斜杠的 URL 编码问题的建议,或者关于构建我的路由以避免此问题的建议,将不胜感激!
当您将包含
/
等特殊字符的 URL 段传递给锚标记帮助程序时,它会自动进行 URL 编码以确保安全传输,因此 /
会转换为 %2F
一个简单的解决方案是使用标准锚元素并将 slug 传递给
href
属性:
<a href="/coursedetails/@course.Slug">