![使用curl获取URL的重定向目标](https://linux22.com/image/24574/%E4%BD%BF%E7%94%A8curl%E8%8E%B7%E5%8F%96URL%E7%9A%84%E9%87%8D%E5%AE%9A%E5%90%91%E7%9B%AE%E6%A0%87.png)
我想检查单个 URL 重定向到的位置。例如,来自 Google 搜索结果页面的链接(其中点击始终通过 Google 服务器)。
我可以这样做吗curl
?
答案1
还有一种更简单的方法
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
对于网址
http://raspberrypi.stackexchange.com/a/1521/86
答案2
尝试这个:
$ 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 重定向 URL 略有不同。它们返回一个 Javascript 重定向,这可以很容易地处理,但为什么不处理原始 URL 和 go curl 一起呢?
$ 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/
参考
答案3
卷曲可以配置为遵循重定向并在完成后打印变量。所以你所要求的可以通过以下命令来实现:
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
参数-L (--location)
仍然-I (--head)
对 location-url 进行不必要的 HEAD 请求。
如果您确定不会有多个重定向,最好禁用跟踪位置并使用curl 变量 %{redirect_url}。
此代码仅对指定 URL 执行一次 HEAD 请求,并从 location-header 中获取redirect_url:
curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"