【问题标题】:cURL returns a relative "Location:" url, how to get the full URL?cURL 返回一个相对的“Location:” url,如何获取完整的 URL?
【发布时间】:2017-11-27 08:35:36
【问题描述】:

我正在使用 cURL 来绕过重定向(301、302)和特殊 URL,例如 adf.ly 等。我有一个工作代码,但我无法解决这个特定问题:

当我使用 cURL 跟随 location 参数时,在某些网站上,最后一次重定向可能在其 Location: 结果中有一个相对 url。

为了清楚起见,我在自己的网站中添加了这样的重定向。我正在使用

header("Location: /maintenance"); exit(); 

在我的 PHP 代码中进行演示。我提出了这个快速的 cURL 请求:

$url = "http://deci.deals/post/99/comment/427";

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FAILONERROR, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1712.4 Safari/537.36');
curl_setopt($ch, CURLOPT_HEADER, 1);
$data = curl_exec( $ch );
curl_close($ch);

echo("<br/>CURRENT_URL: ".$url);

if ( preg_match_all( '/Location:\s*(.+)\s*$/im', $data, $matches, PREG_SET_ORDER ) ) {
    $last = array_pop( $matches );
    echo "<br/>FOUND: ".$last[1];
}

输出:

CURRENT_URL: http://deci.deals/post/99/comment/427
FOUND: /maintenance

如您所见,Location 值是一个相对 URL。有没有办法获取绝对 URL 而不是这个?

谢谢!

【问题讨论】:

  • 回声 curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
  • @Robot70 谢谢!信任此 URL 而不是 Location 结果是否安全?
  • 我不知道。这取决于你。

标签: php redirect curl http-status-code-301 http-status-code-302


【解决方案1】:

来自this维基百科页面:

相对 URL 是不包含方案或主机的 URL。在 为了便于理解,它们必须与 原始请求。

http://www.example.com/blog 的客户端请求:

GET /blog HTTP/1.1
Host: www.example.com

服务器响应:

HTTP/1.1 302 Found
Location: /articles/

位置的URL被客户端扩展为

http://www.example.com/articles/

【讨论】:

  • 我正在考虑连接它们,但我认为CURLOPT_FOLLOWLOCATION 可能会提前“跳转”重定向,然后我将无法依赖原始 URL,如果我错了,请纠正我跨度>
猜你喜欢
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 2020-09-11
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
相关资源
最近更新 更多