curl이 리디렉션 된 후 최종 URL 가져 오기
바람직하게 curl 또는 wget을 사용하여 페이지 리디렉션 후 최종 URL을 가져와야합니다.
예를 들어 http://google.com 은 http://www.google.com으로 리디렉션 될 수 있습니다 .
내용은 쉽게 구할 수 curl --max-redirs 10 http://google.com -L
있지만 (예 :) 최종 URL (전의 경우 http://www.google.com ) 에만 관심이 있습니다.
Linux 내장 도구 만 사용하여이 작업을 수행 할 수 있습니까? (명령 줄 만 해당)
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에 잘 응답하지 않습니다.
감사합니다. 도움이되었습니다. 몇 가지 개선 작업을 수행하고이를 도우미 스크립트 "finalurl"에 래핑했습니다.
#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
- -o 출력
/dev/null
- -실제로 다운로드하지 않고 최종 URL 만 확인
- -s 무음 모드, 진행률 표시 줄 없음
이렇게하면 다음과 같은 다른 스크립트에서 명령을 호출 할 수 있습니다.
echo `finalurl http://someurl/`
일반적으로 wget으로이 작업을 수행 할 수 있습니다. wget --content-disposition
"url"을 추가하면 -O /dev/null
실제로 파일을 저장하지 않습니다.
wget -O /dev/null --content-disposition example.com
다른 옵션으로 :
$ 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>
그러나 그것은 첫 번째 것을 지나치지 않습니다.
감사합니다. 나는 당신의 제안을 구현했습니다 : 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
웹 사이트가 리디렉션되지 않으면 공백을 반환하지만 연속 리디렉션에서 작동하므로 충분합니다.
버그가있을 수 있지만 한눈에 잘 작동합니다.
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
이것은 작동합니다.
curl -I somesite.com | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
매개 변수 -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
You could use grep. doesn't wget tell you where it's redirecting too? Just grep that out.
참고URL : https://stackoverflow.com/questions/3074288/get-final-url-after-curl-is-redirected
'program story' 카테고리의 다른 글
Ctrl-Space를 누르지 않고 Eclipse에서 Ctrl-Space (0) | 2020.09.09 |
---|---|
System.Enum에서 기본 정수로 변환하는 방법은 무엇입니까? (0) | 2020.09.09 |
Android는 SQLite의 데이터베이스 버전을 어디에 저장합니까? (0) | 2020.09.09 |
Django 관리자 : 모델에서 editable = False '로 표시된 필드를 표시하는 방법은 무엇입니까? (0) | 2020.09.09 |
SQLAlchemy를 사용하여 새 데이터베이스를 만드는 방법은 무엇입니까? (0) | 2020.09.09 |