【问题标题】:404 error when URL contains a '+' for a parameter with ASP.Net Core当 URL 包含 ASP.Net Core 的参数的“+”时出现 404 错误
【发布时间】:2017-06-06 14:41:55
【问题描述】:

当参数的空格编码为 + 而不是 %20 时,我的服务器返回 404 错误。我不明白为什么。 路线的形式是

[Route("/Search/PRM1/{prm1}/PRM2/{prm2}/PRM3/{prm3}")

我的第一个问题是如何让服务器理解这种 URL?

https://example.com/Search/PRM1/prm1%20value/PRM2/prm2+value/PRM3/prm3%20value

我的第二个问题是如何自动生成带有+ 而不是%20 的网址,哪个更易于阅读?搜索引擎优化有区别吗?

在cshtml中的服务器端生成URL:

<a href="/Search/PRM1/@prm1/PRM2/@prm2/PRM3/@prm3">link</a>

带有 prmX 变量的“明文”文本(包括空格)。使用@System.Net.WebUtility.UrlEncode(prm2)而不是@prm2时生成了+ URL

我检查了下面的链接,但该解决方案似乎不适用于 ASP.Net Core: WebAPI route 404's when there is a trailing space in the URL

【问题讨论】:

  • (Please) Stop Using Unsafe Characters in URLs。如果您希望您的 URL 是“人类可读的”,您应该用 - 替换任何空格(破折号,而不是下划线 - 这也是 SEO 友好的)。如果不是,那么编码是正确的方法,因为无论如何你将它分割成一个 URL必须是机器可读的。
  • @NightOwl888 您的链接将安全字符定义为Alphanumerics [0-9a-zA-Z], special characters $-_.+!*'(),, and reserved characters used for their reserved purposes,因此应包含“+”。 %20 SEO 是否友好?如果是这样,我可以用 %20..
  • 空格 (%20) 不是安全字符。 Microsoft 修复了 ASP.NET 将空格转换为+ 的损坏行为,现在可以将其正确编码为%20。如果您需要使用空格(因为它是搜索功能),则将您的参数添加到查询字符串并将空格编码为%20

标签: asp.net-mvc asp.net-web-api asp.net-core


【解决方案1】:

如果您提供的搜索服务或字段可能涉及特殊字符或 .+/\ ,最好将其发送为 Query String

[Route("/Search/PRM1/{prm1}/PRM2/{prm2}/PRM3?prm3=your value here")

【讨论】:

  • 我不明白为什么 +. 会是特殊字符。我了解\ / ,但不了解其他人。并且查询字符串不是一个选项,因为该服务已经部署并且需要向后兼容性(并且无论如何都没有计划更改 urls 结构:))。搜索字段不涉及这些字符(即使用户可以输入,但不应该),它们是由 UrlEncode 函数生成的(我删除了它,但我不明白为什么)。
  • 点的问题在于它在直接路径时涉及到域/子域的结构。加号也是一个特殊的字符。
  • 无论如何,我理解你的意思,但这并不能解释为什么 URL 参数中的“+”会导致 IIS / ASP.Net.Core 中的 404... :(
猜你喜欢
  • 1970-01-01
  • 2012-08-06
  • 2015-10-20
  • 2018-04-24
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多