link1, link2, link3의 3개 링크가 있다고 가정합니다. link1은 link2로 리디렉션되고 link2는 link3으로 리디렉션됩니다. 그렇다면 컬을 사용하여 어떻게 볼 수 있나요?
답변1
를 사용하여 HTML 헤더를 볼 수 있습니다 -I
. 리디렉션이 메타 새로고침인 경우 제목을 다음과 같이 지정해야 합니다.
curl -I http://google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Thu, 21 Nov 2013 14:59:13 GMT
Expires: Sat, 21 Dec 2013 14:59:13 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic
리디렉션이 PHP를 통해 발생하는 경우 브라우저가 실제로 이동하는 위치를 비교하여 이를 감지할 수 있습니다. Python, JS 등을 사용하여 이를 달성하는 방법에는 여러 가지가 있습니다. 여러분이 관심을 가질 만한 프로젝트 중 하나는 phantomjs
스크립트 가능한 헤드리스 브라우저입니다.
답변2
에서 man curl
:
-w, --write-out <format>
Defines what to display on stdout after a completed and
successful operation.
<...>
redirect_url When an HTTP request was made without -L to
follow redirects, this variable will show the
actual URL a redirect would take you to.
(Added in 7.18.2)
그러면 curl -w "%{redirect_url}" link1
첫 번째 리디렉션 URL이 제공될 수 있습니다.
아마도 다음과 같은 것이 당신에게 도움이 될 것입니다:
URL="http://google.com"
while [ -n "${URL}" ]
do
echo $URL
URL=$(curl -sw "\n\n%{redirect_url}" "${URL}" | tail -n 1)
done
답변3
이 시도:
for link in link1 link2 link3; do
curl -Is "$link" | awk '/Location/{print $2}'
done
또는 사용인터넷 고양이:
for link in link1 link2 link3; do
printf '%s\n%s\n\n%s\n' 'HEAD / HTTP/1.1' "Host: $link" 'Connexion:close' |
netcat $link 80 | awk '/Location/{print $2}'
done
답변4
이 글을 쓰는 시점에서 Debian 시스템과 macOS에서 "location"은 소문자여야 하며, 거짓 긍정을 피하기 위해 일치 문자열은 더 구체적이어야 하므로 @Gilles가 제안하는 awk 솔루션은 다음과 같아야 합니다.
for link in link1 link2 link3; do
curl -Is "$link" | awk '/^location/{print $2}'
done