为什么现代卷曲版本会切断URL的#anchor部分?

时间:2017-09-18 14:14:52

标签: http url curl libcurl

我观察到不同卷曲版本之间的奇怪行为。

在CentOS 6中使用curl 7.19.7如果我curl 'localhost:9999/foo#bar'(nc在9999收听)我得到:

GET /foo#bar HTTP/1.1
User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
Host: localhost:9999
Accept: */*

但如果我在现代系统(Debian 8)上使用curl 7.38.0进行相同的卷曲,我会得到:

GET /foo HTTP/1.1
User-Agent: curl/7.38.0
Host: localhost:9999
Accept: */*

请注意,网址不同:/foo#bar(7.19.7)与/foo(7.38.0)

我理解正确的行为是移除#anchor部分,给定的是curl实现的较新版本。但是,我不明白这种变化的原因......对于这种原因的任何暗示或者对它的参考(例如RFC),请吗?

我试图在the curl changelog中查找信息但是它太冗长了,而且我没有找到它背后的变化和/或基本原理。

2 个答案:

答案 0 :(得分:5)

此修复程序在https://curl.haxx.se/changes.html#7_20_0中描述:

“网址的片段部分不再发送到服务器”

理性的是,片段标识符不会在HTTP请求中发送。见https://www.greenbytes.de/tech/webdav/rfc7230.html#rfc.section.5.1.p.2

“目标URI排除了引用的片段组件(如果有),因为片段标识符是为客户端处理保留的([RFC3986],第3.5节)。”

答案 1 :(得分:0)

您可以尝试转义此代码和URI的所有其他特殊符号:

curl 'localhost:9999/foo%23bar'

这似乎适用于我的卷曲7.47.0。