重定向curl后获取最终URL

时间:2010-06-19 04:05:03

标签: linux redirect curl wget

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

例如 http://google.com 可能会重定向到 http://www.google.com

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

有没有办法只使用Linux内置工具? (仅限命令行)

11 个答案:

答案 0 :(得分:145)

curl的{​​{1}}选项和子变量-w就是您的意思 寻找。

这样的东西
url_effective

更多信息

-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

更多

您可能还想添加-I(这是一个大写的curl -Ls -o /dev/null -w %{url_effective} http://google.com ),这将使命令不下载任何“正文”,但它也会使用HEAD方法,这是不是包含什么问题,而是冒着改变服务器功能的风险。有时服务器对HEAD的反应不好,即使他们对GET的反应很好。

答案 1 :(得分:21)

谢谢,这对我很有帮助。我做了一些改进,并用帮助脚本“finalurl”包装它:

#!/bin/bash
curl $1 -s -L -I -o /dev/null -w '%{url_effective}'
  • -o输出到/dev/null
  • - 我实际上并没有下载,只是发现最终的网址
  • -s silent模式,没有progressbars

这使得可以从其他脚本调用命令:

echo `finalurl http://someurl/`

答案 2 :(得分:6)

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

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

答案 3 :(得分:5)

作为另一种选择:

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

但它没有超越第一个。

答案 4 :(得分:3)

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

如果网站没有重定向,则返回空白,但这对我来说足够好,因为它适用于连续重定向。

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

答案 5 :(得分:2)

我不确定如何使用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

答案 6 :(得分:1)

这样可行:

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

答案 7 :(得分:0)

参数<template> <div id="index"> <img :src="image.src" v-for="image in images"> </div> </template> <script> export default { name: 'Inicio', data() { return { images: [ {src: require('@/assets/xxx.png') }, {src: require('@/assets/xxxx.png') }, {src: require('@/assets/xxx.png') } ] } } } </script> -L (--location)仍对位置URL进行不必要的HEAD请求。

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

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

-I (--head)

速度测试

curl --head --silent --write-out "%{redirect_url}\n" --output /dev/null "https://""goo.gl/QeJeQ4" -重定向到youtube的goo.gl + bit.ly的50个链接

1。有追踪位置

all_videos_link.txt

结果:

time while read -r line; do
    curl -kIsL -w "%{url_effective}\n" -o /dev/null  $line
done < all_videos_link.txt

2。没有追踪位置

real    1m40.832s
user    0m9.266s
sys     0m15.375s

结果:

time while read -r line; do
    curl -kIs -w "%{redirect_url}\n" -o /dev/null  $line
done < all_videos_link.txt

答案 8 :(得分: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'

答案 9 :(得分:0)

allowDbNull="true"只能遵循http重定向。要同时遵循元刷新指令和javascript重定向,您需要功能完善的浏览器,例如无头chrome:

curl

如果未安装chrome,则可以从docker容器中使用它:

#!/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'
}

答案 10 :(得分:-3)

你可以使用grep。不会告诉你它在哪里重定向?只是把它弄出来。