curl이 리디렉션 된 후 최종 URL 가져 오기


110

바람직하게 curl 또는 wget을 사용하여 페이지 리디렉션 후 최종 URL을 가져와야합니다.

예를 들어 http://google.comhttp://www.google.com으로 리디렉션 될 수 있습니다 .

내용은 쉽게 구할 수 curl --max-redirs 10 http://google.com -L있지만 (예 :) 최종 URL (전의 경우 http://www.google.com ) 에만 관심이 있습니다.

Linux 내장 도구 만 사용하여이 작업을 수행 할 수 있습니까? (명령 줄 만 해당)

답변:


191

curl-w옵션 과 하위 변수 url_effective는 당신이 찾고있는 것입니다.

같은 것

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

더 많은 정보

-L 리디렉션 따르기
-s 무음 모드. 아무것도 출력하지 마십시오
-o FILE 출력을 stdout 대신 <file>에 기록합니다.
-w FORMAT 완료 후 출력 할 내용

명령이 "body"를 다운로드하지 않도록 -I하는 대문자 (대문자 i)도 추가 할 수 있습니다. 그러면 HEAD 메서드도 사용됩니다. 이는 질문에 포함 된 것이 아니고 서버가 수행하는 작업을 변경할 위험이 있습니다. 때때로 서버는 GET에 잘 응답하더라도 HEAD에 잘 응답하지 않습니다.


4
당신이 사용할 수있을 것 "-o을 / dev / null"이 파일하지 않으려면
개빈 모건

1
그것은 훌륭한 옵션입니다. 저는 curl이 그렇게 할 수 있다는 것을 결코 몰랐습니다! 그것은 나를 놀라게하는 것을 멈추지 않습니다:-)
Josh

1
컬보다는 셸 기능에 가깝습니다.
가깝습니다

1
@DanielStenberg 필요 -I하지 않으면 실제로 파일을 다운로드합니다.
Steven Penny

2
일부 웹 사이트 curl -A ...에는 예상 위치로 리디렉션하기 위해 스푸핑 된 사용자 에이전트가 필요합니다 .
Ivan Kozik

29

감사합니다. 도움이되었습니다. 몇 가지 개선 작업을 수행하고이를 도우미 스크립트 "finalurl"에 래핑했습니다.

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o 출력 /dev/null
  • -I 실제로 다운로드하지 말고 최종 URL 만 확인하세요.
  • -s 무음 모드, 진행률 표시 줄 없음

이렇게하면 다음과 같은 다른 스크립트에서 명령을 호출 할 수 있습니다.

echo `finalurl http://someurl/`

2
그 아이디어에 감사드립니다. bashrc 파일에서 터미널 사용을 위해 함수로 다시 작성했으며 해당 파일에 간결한 옵션이 필요하지 않았으므로 긴 이름을 사용하여이를 자체 문서화했습니다.finalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0

7

다른 옵션으로 :

$ curl -i http://google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Sat, 19 Jun 2010 04:15:10 GMT
Expires: Mon, 19 Jul 2010 04:15:10 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

그러나 그것은 첫 번째 것을 지나치지 않습니다.


6

일반적으로 wget으로이 작업을 수행 할 수 있습니다. wget --content-disposition"url"을 추가하면 -O /dev/null실제로 파일을 저장하지 않습니다.

wget -O /dev/null --content-disposition example.com


에서 -O /dev/null로만 교체하십시오 -O-. Better :wget -O- --content-disposition example.com
Maxwel Leite

1
wget -O / dev / null --content-disposition example.com 및 wget -O- / dev / null --content-disposition example.com은 리디렉션 된 URL보다 훨씬 많은 출력을 생성합니다. curl $ 1 -s -L -I -o / dev / null -w '% {url_effective}'잘 작동합니다.
Eric Klien

5

감사합니다. 나는 당신의 제안을 구현했습니다 : curl -i + grep

curl -i http://google.com -L | egrep -A 10 '301 Moved Permanently|302 Found' | grep 'Location' | awk -F': ' '{print $2}' | tail -1

웹 사이트가 리디렉션되지 않으면 공백을 반환하지만 연속 리디렉션에서 작동하므로 충분합니다.

버그가있을 수 있지만 한눈에 잘 작동합니다.


2

이것은 작동합니다.

 curl -I somesite.com | perl -n -e '/^Location: (.*)$/ && print "$1\n"'

2

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

리디렉션이 하나 이상 없을 것이라고 확신하는 경우 위치 추적을 비활성화하고 curl-variable % {redirect_url}을 사용하는 것이 좋습니다.

이 코드는 지정된 URL에 대해 하나의 HEAD 요청 만 수행하고 위치 헤더에서 redirect_url을 가져옵니다.

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://""goo.gl/QeJeQ4"

속도 테스트

all_videos_link.txt -YouTube로 리디렉션되는 goo.gl + bit.ly의 50 개 링크

1. 위치를 따르십시오

time while read -r line; do
    curl -kIsL -w "%{url_effective}\n" -o /dev/null  $line
done < all_videos_link.txt

결과 :

real    1m40.832s
user    0m9.266s
sys     0m15.375s

2. 위치를 따르지 않고

time while read -r line; do
    curl -kIs -w "%{redirect_url}\n" -o /dev/null  $line
done < all_videos_link.txt

결과 :

real    0m51.037s
user    0m5.297s
sys     0m8.094s

리디렉션이 하나뿐이라는 것을 미리 아는 것은 매우 드문 것 같습니다.
SamB

1

curl로 수행하는 방법을 잘 모르겠지만 libwww-perl은 GET 별칭을 설치합니다.

$ GET -S -d -e http://google.com
GET http://google.com --> 301 Moved Permanently
GET http://www.google.com/ --> 302 Found
GET http://www.google.ca/ --> 200 OK
Cache-Control: private, max-age=0
Connection: close
Date: Sat, 19 Jun 2010 04:11:01 GMT
Server: gws
Content-Type: text/html; charset=ISO-8859-1
Expires: -1
Client-Date: Sat, 19 Jun 2010 04:11:01 GMT
Client-Peer: 74.125.155.105:80
Client-Response-Num: 1
Set-Cookie: PREF=ID=a1925ca9f8af11b9:TM=1276920661:LM=1276920661:S=ULFrHqOiFDDzDVFB; expires=Mon, 18-Jun-2012 04:11:01 GMT; path=/; domain=.google.ca
Title: Google
X-XSS-Protection: 1; mode=block

0

시도해 볼 수 있습니까?

#!/bin/bash 
LOCATION=`curl -I 'http://your-domain.com/url/redirect?r=something&a=values-VALUES_FILES&e=zip' | perl -n -e '/^Location: (.*)$/ && print "$1\n"'` 
echo "$LOCATION"

참고 : curl -I http://your-domain.com 명령을 실행할 때 다음 과 같은 명령에 작은 따옴표를 사용해야합니다. curl -I 'http://your-domain.com'


-3

grep을 사용할 수 있습니다. 어디로 리디렉션되는지 알려주지 않습니까? 그냥 그거 알아 내세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.