散列

散列

如果您将此链接放入浏览器中:

https://unix.stackexchange.com/q/453740#453743

它返回这个:

https://unix.stackexchange.com/questions/453740/installing-busybox-for-ubuntu#453743

然而 cURL 会删除哈希值:

$ curl -I https://unix.stackexchange.com/q/453740#453743
HTTP/2 302
cache-control: no-cache, no-store, must-revalidate
content-type: text/html; charset=utf-8
location: /questions/453740/installing-busybox-for-ubuntu

cURL 是否可以选择保留结果 URL 的哈希值?本质上,我正在尝试编写一个像浏览器一样解析 URL 的脚本 - 这是我到目前为止所拥有的,但如果 URL 包含哈希值,它就会中断:

$ set https://unix.stackexchange.com/q/453740#453743
$ curl -L -s -o /dev/null -w %{url_effective} "$1"
https://unix.stackexchange.com/questions/453740/installing-busybox-for-ubuntu

答案1

卷曲下载所有的页。
A#指向一个分段

两者不兼容。


散列

该符号#用在网页链接的末尾,以标记整个网页内的位置。

  • 片段 URL

    ...称为“片段 URL”的约定,用于引用 HTML 文档中的锚点。

  • 当链接中带有井号“#”时,这是什么意思

    它是一个“片段”或“命名锚点”。您可以使用链接到文档的一部分。

  • 维基百科:统一资源定位符 (URL)

    可选片段组件,前面带有哈希 (#)。该片段包含一个片段标识符,提供对辅助资源的指示,例如由 URI 的其余部分标识的文章中的章节标题。当主要资源是 HTML 文档时,片段通常是特定元素的 id 属性,Web 浏览器会将该元素滚动到视图中。

它的主要用途是将“表示层”(查看的内容)移动到项目的开头。

卷曲

curl 中没有“表示层”,它的目标是下载整个页面,而不是页面的部分或片段。因此,curl 中的“片段”标记没有用处。它只是被curl 忽略。

解决方法

将标签重新附加到(重定向的)链接:

originallink='https://unix.stackexchange.com/q/453740#453743'
wholepage=$(curl -Lso /dev/null -w %{url_effective} "$originallink")
if [ "$originallink" != "${originallink##*#}" ]; then
    newlink=$wholepage#${originallink##*#}
else
    echo "link contains no segment"
    newlink="$wholepage"
fi
    echo "$newlink"

将打印:

https://unix.stackexchange.com/questions/453740/installing-busybox-for-ubuntu#453743

一个更快的解决方案是不下载该页面。/dev/null无论如何它都会被重定向到。通过删除该-L选项并询问如果遵循(第一个)重定向,链接将是什么。第一个重定向适用于这种情况和大多数其他情况。

wholepage=$(curl -so /dev/null -w %{redirect_url} "$originallink")

答案2

根据curl网站上的这个帖子,标题为:回复:如何发送 URL 的片段部分?哈希标记适用于浏览器而不是服务器,因此为什么curl要截断它。

URI 的片段部分并不意味着在 HTTP 请求中发送 - 它用于标识将使用特定 URI 获取的资源中的特定部分。如果你想强制 #-letter 进入请求,我认为编码听起来是一个完美的主意。

curl除了将其编码为 之外,我没有看到任何方法将其持久化%23,我认为这不是您想要的。

解决方案

由于是客户端在哈希标记之后维护字符串,因此我会“深入研究它”并简单地将其解析出来,然后将其重新附加到返回的 URL,就像curl真正的浏览器客户端所做的那样:

$ set 'https://unix.stackexchange.com/q/453740#453743'
$ echo "$(curl -I -L -s -o /dev/null -w %{url_effective} "$1")#$(echo "$1" | cut -d"#" -f2)"
https://unix.stackexchange.com/questions/453740/installing-busybox-for-ubuntu#453743

参考

相关内容