使用curl获取URL的重定向目标


24

我想检查单个URL重定向到的位置。例如,来自Google搜索结果页面的链接(点击始终通过Google服务器进行)。

我可以用curl吗?

Answers:


18

尝试这个:

$ 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重定向

Google重定向URL略有不同。他们返回一个Javascript重定向,可以很容易地处理它,但是为什么不处理原始URL并一起卷曲呢?

$ 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/

参考

  1. 对于网址解码...

带有特殊字符的特殊网址(例如Google的重定向)如何?例如:google.com/…
宪法

@REACHUS重定向被编码为给定URL的查询字符串。
亚历克斯·张伯伦

@REACHUS不用担心-您可以结合使用2个perl语句。
亚历克斯·张伯伦

20

有一个更简单的方法

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

用于URL

http://raspberrypi.stackexchange.com/a/1521/86

3
但是,由于您还要下载第二页,因此会占用更多时间和带宽。
2015年

1
@unhammer您说得对,更新了我的回答,只提出了要求。
ismail 2015年

7

卷曲可以配置为遵循重定向并在完成后打印变量。因此,您可以使用以下命令来实现您的要求:

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

或尝试这个

curl -s -o /dev/null -I -w "HTTP_CODE: %{http_code}\nREDIRECT_URL: %{redirect_url}\n" http://raspberrypi.stackexchange.com/a/1521/86

如何使用特殊字符的URL特殊(如谷歌的重定向),例如:google.com/...
宪法

只需将url放在单引号中,以便您的shell忽略链接中的特殊字符。但是您声明的链接不会重定向到另一个uri,响应的状态码是200,而不是3xx。您要查找的uri分别隐藏在uri本身的响应内容中。为了进一步检查,您可以使用来研究响应的标头以及来利用响应curl -s -I 'http://yoururl'的内容curl -s 'http://yoururl'(您将看到google使用简单的javascript进行重定向)。
user1146332 2012年

0

参数 -L (--location)-I (--head)仍然做不必要HEAD-请求发送给位置的URL。

如果您确定最多只能有一个重定向,则最好禁用跟随位置并使用可卷曲变量%{redirect_url}。

此代码仅对指定的URL执行一个HEAD请求,并从location-header中获取redirect_url:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://goo.gl/QeJeQ4"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.