抓取重定向的目标链接

Posted

技术标签:

【中文标题】抓取重定向的目标链接【英文标题】:Grabbing Destination Link of a Redirect 【发布时间】:2012-11-22 15:46:23 【问题描述】:

希望我只是忽略了这一点。

我正在尝试使用 php 获取重定向链接的目标 URL。这是为了获取附属/隐藏链接的站点 URL。

最佳示例:http://tinyurl.com/2tx 访问 google.com

注意:这是一个示例,链接是动态创建的

现在我通过 URL 传递

www.mysite.com/redirect.php?link=http://tinyurl.com/2tx

这是来自该站点的代码 - 注意:由于 URL 中包含与号,因此我必须通过 GET 走这条路线。

<?php
    $name = http_build_query($_GET);
    // which you would then may want to strip away the first 'name='
    $name = substr($name, strlen('name='));
    //change link to a nice URL
    $url = rawurldecode($name);
?>

我有一个抓取 URL 的简单脚本,如何处理 URL 以获取目标 URL?

希望这不会太令人困惑。

干杯, 罗伯

【问题讨论】:

这很混乱。你的意思是 $_GET['link']? 我认为正在寻找一种从 tinyurl 链接获取“google.com”的方法 这就是你需要的:zzz.rezo.net/HowTo-Expand-Short-URLs.html 我需要获取隐藏链接的目标 URL。我添加了我正在使用的代码。对不起,我太傻了! 【参考方案1】:

下次您应该发布一些代码。我假设您正在使用cURL 来执行此操作。这很简单:

//sanitize
$ch = curl_init($_GET['link']);

//follow redirects
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

curl_exec($ch);

$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

编辑:根据 Dagon,您只想“知道网址但不去那里”。如果您只需要知道 url 而不需要获取其内容,则使用此设置会更有效:

curl_setopt($ch, CURLOPT_NOBODY, true);

【讨论】:

@Dagon 我以为他想获取目标网址 我虽然他想知道网址但不去那里 - 我们中的一个人是对的 :-) 有趣...实际上你都对...我的第二步是实际转到链接。但我需要先在 Facebook 上分享链接。隐藏的链接不能很好地在 Facebook 上分享,所以我将通过目标链接(为什么我首先需要它)然后在分享时将它们重定向。 @synergy989 指向您页面的链接显示在哪里?您需要在该 URL 中编码 &amp; 你会想要添加这个:curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 否则它会全部显示在页面上。【参考方案2】:

我会这样做(阅读 cmets):

<?php

// Connect to the page:
$ch = curl_init("http://tinyurl.com/2tx");

// Don't get the body (remove if you want the body):
curl_setopt($ch, CURLOPT_NOBODY, true);

// Follow the page redirects:
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

// Retun the data as a string (Remove to echo to the page):
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Execute:
curl_exec($ch);

// Get data:
print_r($data = curl_getinfo($ch));

// Get just the url:
echo $data["url"];

【讨论】:

哦,到目前为止这很好......问题,我如何在打印链接之前摆脱所有废话?你可以在这里看到:mediaortech.com/justme/redirect2.php 只需将此print_r($data = curl_getinfo($ch)); 替换为此$data = curl_getinfo($ch); 你我的朋友已经成功了——我应该看到那个愚蠢的 print_r【参考方案3】:

向您拥有的 URL 发出 HTTP HEAD 请求。您将收到带有目标 URL 的 HTTP 301 或 302 响应。

示例:输入您的 URL here 以查看发出 HTTP 头请求时返回的响应。

【讨论】:

【参考方案4】:

这可能是编码问题。您的 URL 中的参数未编码,因此在尝试使用 $_GET 获取时可能已损坏。

你想使用这个网址:

www.mysite.com/redirect.php?link=http%3A%2F%2Ftinyurl.com%2F2tx

您可以使用urlencode() 函数在PHP 中对URL 变量进行编码。现在可以像这样访问(我认为)您想要的变量:

echo $_GET['link'];  // http://tinyurl.com/2tx

【讨论】:

我进行了编辑以反映这一点,但链接是动态创建的,因此我无法对其进行硬编码:( 链接是在URL中传递给你的页面的吧?比如,如果有人想先看http://goo.gl/ytVLg,那么有人会去http://www.mysite.com/redirect.php?link=http%3A%2F%2Fgoo.gl%2FytVLg 是的,但有没有办法动态编码它们?基本上有人进来并输入: wwww.mysite.com/redirect.php?link=LINKHERE 我个人无法对链接进行编码,所以有没有办法通过 PHP 做到这一点?

以上是关于抓取重定向的目标链接的主要内容,如果未能解决你的问题,请参考以下文章

如何获取网站重定向目标网址(最终用户链接)

301重定向与302跳转有什么区别?

将旧页面重定向到主页/索引

重定向使用场景

jQuery链接重定向

使用纯javascript提交表单后重定向