2

我的爬虫引擎似乎与特定客户的网站有问题。

在该站点上,重定向到如下所示的 URL:

http://example.com/dir/aaa$0081 aaa.php (将 URL 显示为未编码,其中 $0081 是使用 HEX 表示的两个字节。)

现在,这是在检查使用 WinInet Windows API 调用 HttpQueryInfo 后返回的缓冲区时,所以此时这两个字节实际上代表了一个 WideChar。

现在,我可以看到例如 $0081 是一个非可视控制字符: Latin-1 Supplement (Unicode block)

问题是,如果我将 URL “按原样”(URL 编码)用于未来对服务器的请求,它会以 400 或 404 响应。(另一方面,它是否被完全删除,它可以工作并且服务器提供正确的页面和响应...)

我怀疑 FireFox/IE/等。在发出 HTTP 请求之前,正在去除 URL 中的不可见控制字符...(至少 IEHTTPHeaders 和 FF Live HTTP Headers 插件不会显示任何不可见字符。)

我想知道是否有人可以为此指出一个标准?对于我所看到的不应在 URL 中找到不可见字符的内容,因此我认为解决方案可能是(在此和将来的情况下)删除这些。但这似乎不是网络上广泛讨论的话题。

4

1 回答 1

3

在给出的示例中,$0081 只是五个 Ascii 字符。但是,如果您的意思是这就是它的样子,并且您(以某种方式)推断出实际的 URL 包含 U+0081,那么应该发生并且至少在 Firefox 上确实发生的情况是它是 % 编码的(“ URL 编码”)为 %C2%81(由 %-编码 U+0081 的 UTF-8 编码形式的两个字节形成。Firefox 在其地址栏中将其显示为空,因为 U+0081 是控制字符,但服务器实际上得到 %C2%81 并且必须从那里获取它。

我不知道空间来自哪里,但是 URL 不能包含空格,除非是 %-encoded (%20)。

相关标准是 Internet 标准STD 66URI Generic Syntax。(目前为 RFC 3986。请注意:在本期中,人们仍然经常将较旧的 RFC 称为“标准”。)

于 2012-09-17T08:21:34.717 回答