2013-02-18 211 views
3

我一直听说W3C建议使用“;”而不是“&”作为查询字符串分隔符。URL中的分号作为查询字符串的分隔符

我们推荐HTTP服务器实现者,特别是CGI 实现者支持使用“;”代替“&”以保存作者 以这种方式转义“&”字符的麻烦。

有人请解释为什么“;”被推荐而不是“&”?

此外,我尝试使用";"而不是"&"。 (例如:.com?str1=val1;str2=val2)。在阅读Request.QueryString["str1"]时,我收到“val1;str2=val2”。所以如果推荐使用";",我们该如何读取查询字符串?

+4

您是否有该报价的来源? – flup 2013-02-18 16:38:40

+3

[Here](http://www.w3.org/TR/html4/appendix/notes.html#hB.2.2)[非常简短的Google](http://www.google.co.uk/search ?HL = EN&q =%22CGI +实施者+支持的%+ 22 +使用+)。 – Rawling 2013-02-18 16:39:39

+0

我认为这不是很多,而不是。但是还有。 – flup 2013-02-18 16:44:03

回答

2

由于链接的文档说,;建议在&因为

使用“&”字符分隔表单域,其在SGML属性值使用分隔字符实体引用进行交互。

例如,假设你希望你的网址是...?q1=v1&q2=v2

有什么错&。但是,如果要将该查询放入HTML属性<a href="...?q1=v1&q2=v2">中,则其中断,因为在HTML属性中,&代表字符实体的开始。你必须跳过&作为&amp;,给<a href="...?q1=v1&amp;q2=v2">,如果你不需要,它会更容易。

;不会像这样超载;你可以把一个放在HTML属性中,而不用担心。因此,如果服务器将;识别为查询参数分隔符,则会更简单。

但是,从外观上看(根据您的实验),ASP.Net 并不是认识到这一点。如何获得它?我不确定你可以。

+0

谢谢你Rawling。我只是尝试 click here,在一个HTML和它的作品。可能是,规范是旧的。或者ASP.net让“&”工作,但是你给它做“;”在这种情况下无用......:P – Jeevan 2013-02-18 17:12:17

+0

您可以使大多数Web服务器识别;使用URL重写 – flup 2013-02-18 17:15:38

+0

它工作在html,因为解析器是如此疯狂的宽容,但不是在xhtml – BeniBela 2013-02-18 17:47:08

1

总之,HTML是一个很大的混乱(由于它的宽大),并使用分号有助于简化这是一个很大。

为了使用分号作为分隔符,我不知道.NET是否允许这种自定义,或者我们的开发人员是否需要编写自己的方法来处理QueryString。 .NET确实让我们可以访问原始的QueryString,我们可以从那里运行它。这就是我所做的。我编写了我自己的方法,但这并不难,但是它花费了大量的测试时间和调试,其中一些是微软在处理代理对时甚至不符合Web标准的错误。我确信我的实现可以使用包括多语言平面在内的全部Unicode字符(因此适用于中文和日文字符等)。在我添加我自己的发现之前,我还需要确认并包括Rawling,Jeevan和BeniBela在罗琳的回答中指出的以及他们对这样的答案的评论的伟大信息:HTML中的错误不能逃避它们,但是它通常起作用,但仅仅是因为解析器如此宽容。因此,我也解释了为什么这会导致错误的编码(这可能是大多数开发人员的牺牲品)。

人们不能依赖于查询字符串这个宽大不当编码与符号的,而有时这种宽大导致讨厌的错误。比方说,例如一个QueryString传递一个随机的ASCII字符串(或用户输入),它们没有正确编码。然后'amp''后面'&'被解码,意想不到的后果是'amp''实质上是“吞噬”。 (通过吞咽,我的意思是它被'吃掉'或者它不见了。)一个实际的使用场景是当用户被要求输入数据库并且用户输入HTML(像StackOverflow这样的)时,但是因为它不是张贴正确然后讨厌的错误发展。

的真正的优势“;”分隔符很简单:正确编码和号分隔的QueryStrings对HTML页面(也是XML)中的URL字符串采取两个步骤的复杂操作。将第一个键和值分解为URL编码,然后将其全部连接起来,然后整个QueryString或URL将被编码为HTML(或者对于使用与HTML编码类似的编码进行编码的XML)。另外请不要忘记,HTML编码和URL编码的编码过程是不同的,重要的是它们是不同的。开发者在两者之间需要小心。由于它们是相似的,新手程序员混淆它们并不罕见。

潜在问题的URL的一个很好的例子是在查询字符串传递两个名称/值时:

  • 一个= '我&你',并
  • B = '你&我'。

这里,使用 '&' 作为分隔符,然后 '?A =我+%26 +你& B =你+%26 +我' 是一个适当的查询字符串,但它shud也被HTML被写入之前编码HTML源代码。这对于无bug是很重要的。大多数开发人员不小心执行第一个URL的这个两步过程对键和值进行编码,然后对HTML源代码中的完整URL进行HTML编码。难怪为什么,当我不得不坐下来认真思考这个过程并彻底检验我的结论时。当名称值为'year =año'时进行成像,或者当我们需要使用代理对代表它们的中文或日文字符时,成像更复杂!

对于a和b,使用时与上述相同的密钥值对“;”作为分隔符,这个过程要简单得多。事实上,和号分隔符使得这个过程比使用分号分隔符复杂两倍多!以下是使用';'表示的相同信息作为分隔符:'?a =我+%26 +你; b =你+%26 +我'。我们注意到唯一的区别是字符串中没有'&'。但是用这个';'分隔符意味着不需要第二个HTML编码URL或QueryString的进程。现在想象一下,如果我正在编写HTML并想要正确的HTML,并且需要编写HTML来解释所有这些内容!所有这些'&'的HTML编码确实增加了很多复杂性(对许多开发人员来说,也有很多混乱)。

新手开发商WUD根本就不是HTML编码查询字符串或URL,这是正确的,当;是分隔符。但是,当&符号编码不正确时,会留下错误空间。所以'someText = blah & amp; blah'wud 需要正确的编码。

同样在.NET中,我们可以为我们的方法编写XML文档。那么,就在今天,我写了一个使用上面的'a = me +%26 + you & b = you +%26 + me'的例子。在我的XML中,我不得不手动输入所有那些功能; XML的字符实体。在XML文档中,它很挑剔,所以必须正确编码&符号。但HTML中的宽容性增加了含糊性。

也许这不是太混乱。但所有的困惑或困难都是由于使用了一种被HTML编码作为分隔符的字符,因此'&'是罪魁祸首。分号可以缓解所有这些并发症。

最后一个考虑:'&'分隔符使得这个过程变得复杂多了,所以我不奇怪为什么QueryStrings中的代理对的Microsoft实现仍然不遵循官方规范。如果您编写自己的方法,则必须说明Microsoft错误地使用百分比编码替代对。官方规范禁止UTF-8中代理对的百分比编码。因此,任何编写自己的方法的人也可以处理全部的Unicode字符,请注意这一点。

相关问题