下面的代码片段是使用cURL从重定向网址获取最终的URL(包含media / zip / rar文件)。它得到了最终的URL,毫无疑问,但它的作用是根据文件的大小而变化,以获得URL。
假设最终URL的文件为1MB,则需要大约5秒才能检索。但如果文件大约35MB,则需要大约150秒的时间。我认为cURL正在下载结果并最终从结果中获取URL。
<?php
echo get_rurl("x_url");//1.2MB -> 5-10sec
//echo get_rurl("y_url");//31.6MB -> 150sec
function get_rurl($url){
// initialize cURL
$curl = curl_init($url);
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
));
// execute the request
$result = curl_exec($curl);
// fail if the request was not successful
if ($result === false) {
curl_close($curl);
return null;
}
// extract the target url
$redirectUrl = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
curl_close($curl);
return $redirectUrl;
}
?>
我无法使用file_get_content()
,因为我只想从指定的重定向网址获取最终网址。
简而言之 - 如何从重定向网址获取最终网址而不下载结果。
希望我说清楚。任何帮助将不胜感激。
答案 0 :(得分:1)
这适用于CURLINFO_EFFECTIVE_URL
,但对于它,选项CURLOPT_FOLLOWLOCATION
必须设置为TRUE
。这是基于CURLINFO_EFFECTIVE_URL
正好返回它所说的内容,即最终加载的有效URL。如果CURLOPT_FOLLOWLOCATION=False
那么有效网址将被请求url,否则它将被重定向到最终网址。
我是使用curl_getinfo完成的。这给了我关于最后一次转移的信息
<?php
echo get_rurl("xurl");
//echo get_rurl("yurl");
function get_rurl($url){
// initialize cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //specify your URL
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); //disable follow redirects
$http_data = curl_exec($ch); //hit the $url
$curl_info = curl_getinfo($ch);
return $curl_info['redirect_url'];// extract final url
}
?>
或强>
即使您可以使用CURLINFO_REDIRECT_URL
或CURLINFO_EFFECTIVE_URL
,具体取决于您的使用案例。参考here
<?php
echo get_rurl("xurl");
//echo get_rurl("yurl");
function get_rurl($url){
// initialize cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //specify your URL
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); //disable follow redirects
$http_data = curl_exec($ch); //hit the $url
return curl_getinfo($ch, CURLINFO_REDIRECT_URL);
}
?>
希望这对其他用户也有帮助。
答案 1 :(得分:0)
根据libcurl(https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html)的文档,这与使用CURLOPT_FOLLOWLOCATION => true,
时的预期完全一致。您可能希望将其更改为false。