我的URL编码有什么问题?

4
在我的asp.net mvc应用程序中,我创建了以下链接:
http://localhost:2689/en/Formula.mvc/351702++LYS+GRONN+5G+9%252f2++fds  

我收到了400错误(错误请求)。

我认为它在%25(正斜杠)处被阻止。
我做错了什么?

--编辑3--
我尝试不编码任何内容,而是依赖于Url.RouteUrl()的默认编码。
似乎这不会对“/”进行编码。
如果我自己先编码它,我最终得到双重编码的%252f。出于某种原因,这会给我带来一个错误请求。 为什么?!

--编辑2--
我生成URI的最后一部分如下:

  1. 取id.toString
  2. 取HttpUtility.UrlEncode(name)
  3. 取HttpUtility.UrlEncode(code)
  4. 使用来自上一部分的值进行String.Format(“{0}--{1}--{2}”)
  5. 将其作为参数添加到Url.RouteUrl()

之后,我的操作再次获取此参数,在“--”处拆分它并HttpUtility.Decode()将值返回。

我这样做是因为最后两个参数是可选的,但是功能参数。如果它们在前面的步骤中定义了,它们必须随着其他页面一起传递。
更少的抽象:颜色可以有多个名称,但是如果用户通过特定名称选择了它,则应在所有其他页面中保留它。

--编辑1--
它看起来HttpUtility.UrlEncode()和Url.Encode()返回不同的结果:S

如果我不对“/”进行编码,它会作为分隔符=>没有帮助。 如果我使用Url.Encode()对其进行编码,我最终得到%2F =>代码400 如果我使用HttpUtility.UrlEncode()对其进行编码,我最终得到%25 =>代码400

因为400甚至不让它通过asp.net-mvc,所以路由调试程序没有用:(


它代表什么意思?它应该是351702++LYS+GRONN+5G+9%2f2f2++fds吗? - Marc Gravell
应该是 351702++LYS GRONN 5G 9/2++fds - Boris Callens
6个回答

3

我几天前去过那里。如果你可以接受URL中无法读取的路由值,请尝试使用以下链接:URL-encoded slash in URL


1
最终我做了类似的事情,只是我把无法转义的值换成了单词,例如:“-斜杠-”。这不是我称之为完美的,但现在这是我能想到的最好方法。 - Boris Callens

2

%25 实际上是编码为 "%", 所以 %252f 被编码为 "%2f".

%2f (被编码为 "/") 在 URL 中不被允许,除非你在 Web 服务器的配置中明确允许。


0

0

我没有仔细研究过编码 - 但请注意,如果这将被存储在某个地方(或以某种方式进行操作),那么POST请求会更合适。 如果右侧的文本实际上代表具有 ID 351702 的数据(类似于 /665354/whats-wrong-with-my-url-encoding 的虚拟 URL),则应该将文本人性化处理,就像上面删除了空格一样。通常情况下,这作为路由中的单独层级是简单丢弃的。

通常,MVC URL 应该是可理解的。


URL的这一部分首先定义了颜色的ID。此后的两个部分是可选的,用于定义首选名称和代码。它必须在整个应用程序中发送。 我旨在成为RESTful,而不是将URL作为人机界面。在我看来这是一个愚蠢的想法。 - Boris Callens
此外,也没有涉及到存储。我知道通过get使任何数据更改可用的危险。 - Boris Callens
我现在明白你的意思,即将ID与描述分开。在我的情况下,描述不仅仅是为了SEO而存在,它还有一个功能性的目的。由于我的源数据库的工作方式(我无法更改它),描述是某些内容的关键。 - Boris Callens

0

在URL中,您不能使用正斜杠作为值。这里有一篇关于创建浏览器和SEO友好的URL的不错文章 => http://www.dominicpettifer.co.uk/displayBlog.aspx?id=34

[编辑] 每当您创建一个路由时,您都会将其与URL模式相关联(默认模式为{controller}/{action}/{id})。在此URL模式中,您应该使用正斜杠来分隔不同的标记。希望这可以帮助到您。


那么,有什么替代方案呢?为什么URL编码没有捕捉到这个问题? - Boris Callens
是的,你可以。这只是默认配置不允许它。 - vartec
每当您创建一个路由时,都会将其与URL模式相关联(默认模式为{controller}/{action}/{id})。在此URL模式中,您应该使用正斜杠来分隔不同的标记。希望这有所帮助。 - Khaja Minhajuddin
%252F不是/,它是双重编码的斜杠。没有理由它不能工作。 - vartec
你是对的,我说的话只针对“斜杠”字符,对于“百分号”字符应该也能正常工作。我的错误。 - Khaja Minhajuddin

0

查询字符串确实可以。但这不是查询字符串的一部分。我也不能把它作为查询字符串的一部分。 - Boris Callens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接