为什么我的 URL slug 中的 / 在 ASP.NET Core 中转换为 %2F?

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

我正在开发一个 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,也会发生这种情况,而且看起来不一致。

示例问题

  1. 在数据库中,我将 slug 存储为

    en/learn-english-in-99-days

  2. 当我像这样导航到浏览器中的 URL 时:

    https://localhost:7213/CourseDetails/en%2Flearn-english-in-99-days
    

    浏览器将

    %2F
    转换为斜杠,从而产生以下 URL:

    https://localhost:7213/CourseDetails/en/learn-english-in-99-days
    
  3. 当 ASP.NET Core 处理请求时,转换后的 URL(使用

    /
    而不是
    %2F
    )与数据库中存储的 slug 不匹配。这会导致问题,例如找不到课程并返回 404 错误。

我尝试过的

  • 自定义中间件:我尝试创建中间件来将请求路径中的

    %2F
    替换为
    /
    ,但这仍然会导致浏览器用斜杠显示解码路径时出现问题。

  • 手动编码和解码:我在 Razor 页面的

    Uri.UnescapeDataString
    处理程序中使用
    OnGet
    来解码 ID,但仍然无法完全解决问题,因为编码和解码看起来不一致。

问题

为什么斜杠 (

/
) 会转换为
%2F
或者有时是空格,即使它作为常规斜杠存储在数据库中也是如此?如何保持正确的编码/解码,使 URL 与数据库中存储的格式匹配,从而允许我检索正确的资源?

环境

  • ASP.NET Core Razor 页面
  • 使用类似
    https://localhost
  • 的 URL 在本地运行

任何关于如何处理 ASP.NET Core 中带有斜杠的 URL 编码问题的建议,或者关于构建我的路由以避免此问题的建议,将不胜感激!

c# asp.net-core asp.net-core-mvc razor-pages
1个回答
0
投票

当您将包含

/
等特殊字符的 URL 段传递给锚标记帮助程序时,它会自动进行 URL 编码以确保安全传输,因此
/
会转换为
%2F

一个简单的解决方案是使用标准锚元素并将 slug 传递给

href
属性:

<a href="/coursedetails/@course.Slug">

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