このリンクをブラウザに配置した場合:
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
カールダウンロード全体ページ。
A #
はフラグメントを指します。
どちらも互換性がありません。
記号#
は、Webページリンクの最後に使用され、Webページ全体の内部の位置を示します。
... HTMLドキュメント内のアンカーを参照するための「フラグメントURL」と呼ばれる規則。
これは「フラグメント」または「名前付きアンカー」です。ドキュメントの一部にリンクするために使用できます。
ウィキペディア:Uniform Resource Locator(URL)
ハッシュ(#)が前に付いたオプションのフラグメントコンポーネント。フラグメントには、URIの残りの部分で識別される記事のセクション見出しなど、セカンダリリソースへの方向を提供するフラグメント識別子が含まれます。プライマリリソースがHTMLドキュメントの場合、フラグメントは特定の要素のid属性であることが多く、Webブラウザはこの要素をスクロールして表示します。
その主な用途は、「プレゼンテーション層」(表示されるもの)をアイテムの先頭に移動することです。
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")
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