curl로 URL의 리디렉션 대상 가져 오기


24

단일 URL이 리디렉션되는 위치를 확인하고 싶습니다. 그 예로는 Google 검색 결과 페이지 (클릭이 항상 Google 서버를 통과하는)의 링크가 있습니다.

그걸로 할 수 있습니까 curl?

답변:


18

이 시도:

$ LOCATION=`curl -I http://raspberrypi.stackexchange.com/a/1521/86 | perl -n -e '/^Location: (.*)$/ && print "$1\n"'`
$ echo "$LOCATION"
/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521#1521

Google 리디렉션

Google 리디렉션 URL은 약간 다릅니다. 그들은 쉽게 처리 할 수있는 Javascript 리디렉션을 반환하지만 원래 URL을 처리하고 모두 함께 컬하지 않는 이유는 무엇입니까?

$ URL="http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFAQFjAA&url=http%3A%2F%2Fwww.raspberrypi.org%2F&ei=rv8oUODIIMvKswa4xoHQAg&usg=AFQjCNEBMoebclm0Gk0LCZIStJbF04U1cQ"
$ LOCATION=`echo "$URL" | perl -n -e '/url=([a-zA-Z0-9%\.]*)/ && print "$1\n"'`
$ echo "$LOCATION"
http%3A%2F%2Fwww.raspberrypi.org%2F
$ echo "$LOCATION" | perl -pe 's/%([0-9a-f]{2})/sprintf("%s", pack("H2",$1))/eig'
http://www.raspberrypi.org/

참고

  1. URL 디코딩의 경우 ...


@REACHUS 리디렉션은 지정된 URL의 쿼리 문자열로 인코딩됩니다.
Alex Chamberlain

@REACHUS 걱정할 필요가 없습니다. 아마 2 개의 펄 구문을 결합 할 수 있습니다.
Alex Chamberlain

20

훨씬 쉬운 방법이 있습니다

curl -w "%{url_effective}\n" -I -L -s -S $URL -o /dev/null

인쇄 할 것이다

http://raspberrypi.stackexchange.com/questions/1508/how-do-i-access-the-distributions-name-on-the-command-line/1521

URL

http://raspberrypi.stackexchange.com/a/1521/86

3
두 번째 페이지도 다운로드하기 때문에 더 많은 시간과 대역폭을 사용합니다.
unhammer

1
@unhammer 당신은 맞아요, 머리 요청 만 할 수 있도록 내 대답을 업데이트했습니다.
ismail

7

curl 은 리디렉션을 따르고 완료 후 변수를 인쇄하도록 구성 할 수 있습니다. 따라서 다음 명령을 사용하여 원하는 것을 얻을 수 있습니다.

curl -Ls -w %{url_effective} -o /dev/null https://google.com

매뉴얼 페이지는 다음과 같은 필수 매개 변수를 설명합니다.

-L, --location          Follow redirects (H)
-s, --silent            Silent mode (don't output anything)
-w, --write-out FORMAT  Use output FORMAT after completion
-o, --output FILE       Write to FILE instead of stdout

4

또는 이것을 시도하십시오

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86


URL을 작은 따옴표로 묶어 쉘이 링크의 특수 문자를 무시하도록하십시오. 그러나 귀하가 언급 한 링크는 다른 URI로 리디렉션되지 않으며 응답의 상태 코드는 200이며 3xx는 아닙니다. 원하는 URI는 응답 내용에 URI 자체에 각각 숨겨져 있습니다. 추가 검사를 위해 응답 헤더와 응답 curl -s -I 'http://yoururl'내용을 연구 할 수 있습니다 curl -s 'http://yoururl'(Google은 리디렉션에 간단한 자바 스크립트를 사용함을 알 수 있습니다).
user1146332

0

매개 변수 -L (--location)-I (--head)여전히 위치 URL에 대한 불필요한 HEAD 요청을 수행합니다.

리디렉션이 둘 이상 없을 경우 팔로우 위치를 사용 중지하고 curl-variable % {redirect_url}을 사용하는 것이 좋습니다.

이 코드는 지정된 URL에 대한 HEAD 요청을 하나만 수행하고 location-header에서 redirect_url을 가져옵니다.

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.