Linux 重定向curl后获取最终URL

Linux 重定向curl后获取最终URL,linux,redirect,curl,wget,Linux,Redirect,Curl,Wget,我需要在页面重定向后获得最终URL,最好使用curl或wget 例如,可以重定向到 内容很容易获取(例如,curl--max-redirs 10http://google.com -L),但我只对最终的url感兴趣(在前一种情况下) 只有使用Linux内置工具才能做到这一点吗?(仅限命令行)您可以使用grep。wget没有告诉你它在哪里重定向吗?我不知道如何使用curl,但是libwww-perl安装了GET别名 $ GET -S -d -e http://google.com GET http

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

例如,可以重定向到

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


只有使用Linux内置工具才能做到这一点吗?(仅限命令行)

您可以使用grep。wget没有告诉你它在哪里重定向吗?我不知道如何使用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
作为另一种选择:

$ 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>
$curl-ihttp://google.com
HTTP/1.1 301永久移动
地点:http://www.google.com/
内容类型:text/html;字符集=UTF-8
日期:2010年6月19日星期六04:15:10 GMT
过期时间:2010年7月19日星期一04:15:10 GMT
缓存控制:公共,最大年龄=2592000
服务器:gws
内容长度:219
X-XSS-Protection:1;模式=块
301移动
301移动
文档已移动
.

但是第一个还没有过去。

谢谢。我最终实现了你的建议: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
如果网站没有重定向,则返回空白,但这对我来说已经足够了,因为它可以连续重定向

可能有问题,但乍一看它工作正常。

curl
,子变量
url\u effective
寻找

差不多

curl-Ls-o/dev/null-w%{url\u-effective}http://google.com
更多信息

-L Follow redirects -s Silent mode. Don't output anything -o FILE Write output to <file> instead of stdout -w FORMAT What to output after completion -我跟踪重定向 -s静音模式。不要输出任何东西 -o将文件写入输出,而不是标准输出 -w格式完成后要输出的内容 更多


您可能还想添加(即大写的
i
),这将使命令不会下载任何“body”,但它随后也会使用HEAD方法,这不是问题所包含的内容,并且有可能更改服务器的操作。有时候,服务器对HEAD的响应并不好,即使它们的响应很好。

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

  • -o
    输出到
    /dev/null
  • -I
    实际上并不下载,只需查找最终的URL即可
  • -s
    静音模式,无进度条
这样就可以从其他脚本调用该命令,如下所示:

echo `finalurl http://someurl/`

您通常可以使用wget执行此操作
wget--content disposition
“url”另外,如果添加
-O/dev/null
,则不会实际保存文件

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

这将起作用:

 curl -I somesite.com | perl -n -e '/^Location: (.*)$/ && print "$1\n"'
参数
-L(--location)
-I(--head)
仍对位置url执行不必要的head请求

如果您确信将不会有多个重定向,那么最好禁用follow location并使用curl变量%{redirect_url}

此代码仅对指定的URL执行一个HEAD请求,并从位置标头获取重定向URL:

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://""goo.gl/QeJeQ4"

速度测试
所有视频\u link.txt
-50个重定向到youtube的goo.gl+bit.ly链接

1.跟随位置 2.无跟随位置 你能试试吗

#!/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命令时,我必须在命令中使用单引号,如
curl-I'http://your-domain.com“

curl
只能跟随http重定向。为了遵循元刷新指令和javascript重定向,您需要一个完整的浏览器,如headless chrome:

#!/bin/bash
real_url () {
    printf 'location.href\nquit\n' | \
    chromium-browser --headless --disable-gpu --disable-software-rasterizer \
    --disable-dev-shm-usage --no-sandbox --repl "$@" 2> /dev/null \
    | tr -d '>>> ' | jq -r '.result.value'
}
如果未安装chrome,可以从docker容器中使用它:

#!/bin/bash
real_url () {
    printf 'location.href\nquit\n' | \
    docker run -i --rm --user "$(id -u "$USER")" --volume "$(pwd)":/usr/src/app \
    zenika/alpine-chrome --no-sandbox --repl "$@" 2> /dev/null \
    | tr -d '>>> ' | jq -r '.result.value'
}
像这样:

$ real_url http://dx.doi.org/10.1016/j.pgeola.2020.06.005 
https://www.sciencedirect.com/science/article/abs/pii/S0016787820300638?via%3Dihub

如果您不想要这个文件,您应该能够使用“-o/dev/null”。这是一个很好的选择,我从来不知道curl可以做到这一点!它从未停止让我惊讶
:-)
这更像是一个shell特性,而不是curl@DanielStenberg你需要
-I
否则它将实际下载该文件。一些网站还需要一个带有
curl-a…
的欺骗用户代理重定向到预期位置。谢谢你的这些想法。我在.bashrc文件中将其作为函数重写以供终端使用,该文件中不需要简洁的选项,因此我使用了长名称来自我记录:
finalurl(){curl--silent--location--head--output/dev/null--写出“{url\u-effective}”--“$@”}
-O/dev/null
替换为仅
-O-
。更好:
wget-O--content-disposition-example.com
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\u effective}”对我来说很好。如果您事先知道只有一个重定向,这似乎很少见。。。
real    0m51.037s
user    0m5.297s
sys     0m8.094s
#!/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"
#!/bin/bash
real_url () {
    printf 'location.href\nquit\n' | \
    chromium-browser --headless --disable-gpu --disable-software-rasterizer \
    --disable-dev-shm-usage --no-sandbox --repl "$@" 2> /dev/null \
    | tr -d '>>> ' | jq -r '.result.value'
}
#!/bin/bash
real_url () {
    printf 'location.href\nquit\n' | \
    docker run -i --rm --user "$(id -u "$USER")" --volume "$(pwd)":/usr/src/app \
    zenika/alpine-chrome --no-sandbox --repl "$@" 2> /dev/null \
    | tr -d '>>> ' | jq -r '.result.value'
}
$ real_url http://dx.doi.org/10.1016/j.pgeola.2020.06.005 
https://www.sciencedirect.com/science/article/abs/pii/S0016787820300638?via%3Dihub