cURL url_effective com Hash

1

Se você colocar este link em um navegador:

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

retorna isso:

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

No entanto cURL descarta o hash:

$ 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

O cURL tem uma opção para manter o hash com o URL resultante? Essencialmente eu Estou tentando escrever um script que irá resolver URLs como um navegador - isso é o que Eu tenho até agora, mas quebra se o URL contém um hash:

$ 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
    
por Steven Penny 06.07.2018 / 01:52

2 respostas

1

Curl download de páginas whole .
Um # aponta para um fragmento .

Ambos não são compatíveis.

hash

O símbolo # é usado no final de um link de página da web para marcar uma posição dentro de uma página da web inteira.

  • URLs de fragmento

    ...convention called "fragment URLs" to refer to anchors within an HTML document.

  • O que acontece quando um link tem um sinal "#" no

    It's a "fragment" or "named anchor". You can you use to link to part of a document.

  • Wikipedia: Localizador Uniforme de Recursos (URL)

    An optional fragment component preceded by an hash (#). The fragment contains a fragment identifier providing direction to a secondary resource, such as a section heading in an article identified by the remainder of the URI. When the primary resource is an HTML document, the fragment is often an id attribute of a specific element, and web browsers will scroll this element into view.

Seu principal uso é mover a "camada de apresentação" (o que é exibido) para o início de um item.

curl

Não há "camada de apresentação" no curl, seu objetivo é baixar páginas inteiras, não partes ou fragmentos de páginas. Portanto, não há uso para um marcador de "fragmento" em ondulação. É simplesmente ignorado pela onda.

Solução alternativa

Adicione novamente a tag ao link (redirecionado):

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"

imprimirá:

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

Uma solução bastante mais rápida é não baixar a página. Ele está sendo redirecionado para /dev/null mesmo assim. Removendo a opção -L e perguntando qual seria o link se o (primeiro) redirecionamento fosse seguido. O primeiro redirecionamento funciona neste caso e na maioria dos outros.

wholepage=$(curl -so /dev/null -w %{redirect_url} "$originallink")
    
por 06.07.2018 / 16:11
0

De acordo com este tópico no site curl intitulado: Re: Como enviar uma parte do fragmento de URL? O hashmark é destinado ao navegador e não ao servidor, daí porque curl está truncando-o.

The fragment part of a URI is not meant to be sent in the HTTP request - it is used to identify a specific section in the resource that will be fetched by using the particular URI. If you want to force #-letter into the request I think encoding it sounds like a perfect idea.

Olhando eu não vi nenhum método para curl persistir além de codificá-lo como %23 , o que eu acho que não é o que você quer.

Solução

Como é o cliente que mantém a string após o hashmark, eu me "debrucei" e simplesmente o analiso e, em seguida, reaplico-o ao URL retornado de curl , já que um verdadeiro cliente de navegador faria isso :

$ 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

Referências

por 06.07.2018 / 03:15