卷曲。检查重定向

卷曲。检查重定向

假设我们有 3 个链接:link1、link2、link3。 link1 重定向到 link2,link2 重定向到 link3。那么如何用curl 看到它呢?

答案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="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

相关内容