确定PHP中缩短URL的最终目的地?

确定PHP中缩短URL的最终目的地?,php,url-routing,bit.ly,Php,Url Routing,Bit.ly,如何在PHP中实现这一点?e、 g bit.ly/f00b4r==> 在Java中,解决方案如下: 您应该向 使用HttpWebRequest的url 例如。在返回的 HttpWebResponse,请检查 回应 只要确保允许自动重定向 在HttpWebRequest上设置为true 实例(默认情况下为true)。 (Thx,casperOne) 代码是 private static string GetRealUrl(string url) { WebRequest request =

如何在PHP中实现这一点?e、 g

bit.ly/f00b4r==>

在Java中,解决方案如下:

您应该向 使用HttpWebRequest的url 例如。在返回的 HttpWebResponse,请检查 回应

只要确保允许自动重定向 在HttpWebRequest上设置为true 实例(默认情况下为true)。 (Thx,casperOne)

代码是

private static string GetRealUrl(string url)
{
    WebRequest request = WebRequest.Create(url);
    request.Method = WebRequestMethods.Http.Head;
    WebResponse response = request.GetResponse();
    return response.ResponseUri.ToString();
}
(泰晤士报,弗雷德里克·莫克)

但是我想用PHP来做。怎么办?:)

功劳归于


您是否阅读了bit.ly API?具体地说

我看不出这个问题。你在谈论可能的重定向吗?

尝试的时候,你已经找到了答案

尽管如此,我还是会选择这样的方式:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://bit.ly/tqdUj");
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);

$url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);

curl_close($ch);

var_dump($url);
一些解释:

  • 请求的URL是短URL
  • 你不需要标题
  • 您需要确保主体没有显示——可能是无用的
  • 你不想要身体;你想要一个头部请求,而不是
  • 当然,您希望跟踪位置
  • 执行请求后,您希望获取已获取的“真实”URL
在这里,你可以得到:

string 'http://wordpress.org/extend/plugins/wp-pubsubhubbub/' (length=52)
(来自我最近看到的一条推特,其中包含一个简短的URL)


这应该适用于任何缩短URL服务,独立于它们的特定API


您可能还想调整其他一些选项,如超时;有关更多信息,请参阅。

这是我的解决方案。我对它进行了编码,因为上面所有的操作都不正确

function get_final_location($url, $index=null) {

    if (is_array($url)) {
        $headers = $url;
    }
    else {
        $headers = get_headers($url, 1)['Location'];    
        if (count($headers) == 0) {
            return $url;
        }
    }

    if (is_null($index)) {
        $to_check   = end($headers);
        $index      = count($headers) - 1;
    }
    else {
        $to_check = $headers[$index];
    }

    if (!filter_var($to_check, FILTER_VALIDATE_URL) === false) {
        if (count($headers) - 1 > $index) {
            $lp = parse_url($headers[$index], PHP_URL_SCHEME) . "://" . parse_url($headers[$index], PHP_URL_HOST) . $headers[$index+1];
        }
        else {
            $lp = $to_check;
        }
    }
    else {
        $index--;
        $lp = landingpage($headers, $index);
    }

    return $lp;

}

你需要这个来做特定的短款吗?或者你只是泛泛而谈?许多“好”的短消息可以在通过APIFYI调用时为您提供最终目的地:如果您试图让twitter URL重定向,它们会给出200个响应代码,因此您必须从正文中获取
位置。替换(“http:\/\/tinyurl.com\/7ktoegq”)
。如果使用特定的API,您必须为每个不同的缩短URL服务创建新的特定代码;考虑到其中有很多,你永远不会停止编码和测试。。。一些与任何服务一起工作的“通用”解决方案可能会更容易,至少作为一个长期解决方案……解析位置头可能会起作用;但是,如果有两个(或更多)级别的重定向呢?(是的,不是你通常看到的,但是如果目标站点在发布新版本的站点的当天设置了一些重定向怎么办?)我在t.co twitter链接上尝试了一些方法,这是迄今为止唯一对我有效的方法。谢谢+1.
string 'http://wordpress.org/extend/plugins/wp-pubsubhubbub/' (length=52)
function get_final_location($url, $index=null) {

    if (is_array($url)) {
        $headers = $url;
    }
    else {
        $headers = get_headers($url, 1)['Location'];    
        if (count($headers) == 0) {
            return $url;
        }
    }

    if (is_null($index)) {
        $to_check   = end($headers);
        $index      = count($headers) - 1;
    }
    else {
        $to_check = $headers[$index];
    }

    if (!filter_var($to_check, FILTER_VALIDATE_URL) === false) {
        if (count($headers) - 1 > $index) {
            $lp = parse_url($headers[$index], PHP_URL_SCHEME) . "://" . parse_url($headers[$index], PHP_URL_HOST) . $headers[$index+1];
        }
        else {
            $lp = $to_check;
        }
    }
    else {
        $index--;
        $lp = landingpage($headers, $index);
    }

    return $lp;

}