web-dev-qa-db-ja.com

ハッシュを使用したcURLurl_effective

このリンクをブラウザに配置した場合:

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
2
Steven Penny

カールダウンロード全体ページ。
A #フラグメントを指します。

どちらも互換性がありません。


ハッシュ

記号#は、Webページリンクの最後に使用され、Webページ全体の内部の位置を示します。

  • フラグメントURL

    ... HTMLドキュメント内のアンカーを参照するための「フラグメントURL」と呼ばれる規則。

  • リンクにポンド「#」記号が含まれている場合はどうなりますか

    これは「フラグメント」または「名前付きアンカー」です。ドキュメントの一部にリンクするために使用できます。

  • ウィキペディア:Uniform Resource Locator(URL)

    ハッシュ(#)が前に付いたオプションのフラグメントコンポーネント。フラグメントには、URIの残りの部分で識別される記事のセクション見出しなど、セカンダリリソースへの方向を提供するフラグメント識別子が含まれます。プライマリリソースがHTMLドキュメントの場合、フラグメントは特定の要素のid属性であることが多く、Webブラウザはこの要素をスクロールして表示します。

その主な用途は、「プレゼンテーション層」(表示されるもの)をアイテムの先頭に移動することです。

curl

Curlには「プレゼンテーション層」はありません。その目的は、ページの一部や断片ではなく、ページ全体をダウンロードすることです。したがって、カールの「フラグメント」マーカーは使用できません。それは単にcurlによって無視されます。

Workaround

タグを(リダイレクトされた)リンクに再追加します。

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")
1
Isaac

curl Webサイトのこのスレッドによると: Re:URLのフラグメント部分を送信する方法は? ハッシュマークはサーバーではなくブラウザを対象としているため、なぜcurlはそれを切り捨てています。

URIのフラグメント部分は、HTTPリクエストで送信されることを意図したものではありません。特定のURIを使用してフェッチされるリソース内の特定のセクションを識別するために使用されます。 #文字をリクエストに強制したい場合は、エンコードするのは完璧なアイデアのように思えます。

見てみると、curl%23としてエンコードする以外にそれを永続化する方法は見当たりませんでしたが、これはあなたが望んでいることではないと思います。

解決

ハッシュマークの後の文字列を維持しているのはクライアントなので、「それに寄りかかって」単純に解析してから、実際のブラウザクライアントが行うように、curlから返されたURLに再追加します。 :

$ 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

参考文献

0
slm