重定向curl后获取最终URL


110

最好使用curl或wget重定向页面后,我需要获取最终URL。

例如,http://google.com可以重定向到http://www.google.com

内容很容易获得(例如curl --max-redirs 10 http://google.com -L),但是我只对最终URL(在前一种情况下为http://www.google.com)感兴趣。

仅使用Linux内置工具有什么办法做到这一点?(仅命令行)

Answers:


191

curl-w选项和sub变量url_effective就是您要寻找的。

就像是

curl -Ls -o /dev/null -w %{url_effective} http://google.com

更多信息

-L关注重定向
-s静默模式。什么都不输出
-o FILE将输出写到<file>而不是stdout
-w FORMAT完成后输出什么

更多

您可能还希望添加-I(这是一个大写字母i),这将使该命令不下载任何“ body”,但是它随后还使用HEAD方法,这不是要包含的问题,并且可能会更改服务器的功能。有时,即使服务器对GET的响应很好,服务器对HEAD的响应也不好。


4
如果您不需要该文件,则应该可以使用“ -o / dev / null”
Gavin Mogan 2010年

1
这是一个不错的选择,我不知道curl可以做到!它永远不会令我惊讶:-)
乔什(Josh)2010年

1
这比curl更像是一种外壳功能
user151841'5

1
您需要@DanielStenberg,-I否则它将实际下载文件。
Steven Penny 2014年

2
某些网站还需要具有欺骗性的用户代理,curl -A ...才能重定向到预期的位置。
伊万·科兹克

29

谢谢,这对我有帮助。我做了一些改进,并将其包装在辅助脚本“ finalurl”中:

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o 输出到 /dev/null
  • -I 实际不下载,只需找到最终URL
  • -s 静音模式,无进度条

这样就可以从其他脚本中调用命令,如下所示:

echo `finalurl http://someurl/`

2
感谢您的想法。我将其重写为函数,以便在我的.bashrc文件中用作终端使用,并且该文件中不需要简洁的选项,因此我使用了长名称对此进行了自我记录:finalurl() { curl --silent --location --head --output /dev/null --write-out '%{url_effective}' -- "$@"; }
gw0

7

作为另一种选择:

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

但这并没有超过第一个。


6

您通常可以使用wget进行此操作。 wget --content-disposition如果您添加“ url”,那么您-O /dev/null实际上将不会保存文件。

wget -O /dev/null --content-disposition example.com


从替换-O /dev/null为仅-O-。更好:wget -O- --content-disposition example.com
Maxwel Leite

1
wget -O / dev / null --content-disposition example.com和wget -O- / dev / null --content-disposition example.com比重定向URL产生更多的输出。curl $ 1 -s -L -I -o / dev / null -w'%{url_effective}'对我来说很好。
埃里克·克莱恩

5

谢谢。我最终实现了您的建议: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

如果网站不重定向,则返回空白,但这对我来说已经足够了,因为它可以用于连续重定向。

可能是越野车,但一眼就可以了。


2

这将工作:

 curl -I somesite.com | perl -n -e '/^Location: (.*)$/ && print "$1\n"'

2

的参数-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"

速度测试

all_videos_link.txt -goo.gl + bit.ly的50个链接,这些链接重定向到youtube

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

似乎很少见,您会事先知道只有一个重定向……
SamB

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

0

你可以试一下吗?

#!/bin/bash 
LOCATION=`curl -I 'http://your-domain.com/url/redirect?r=something&a=values-VALUES_FILES&e=zip' | perl -n -e '/^Location: (.*)$/ && print "$1\n"'` 
echo "$LOCATION"

注意:当您执行命令curl -I http://your-domain.com时,必须在命令中使用单引号,例如 curl -I 'http://your-domain.com'


-3

您可以使用grep。wget不会告诉您重定向的位置吗?只是grep出来。

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.