在PHP中使用CURL跟随重定向

8
我知道使用cURL可以查看目标URL,将cURL指向具有CURLOPT_FOLLOWLOCATION = true的URL。
例如:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "www.example1.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
$result = curl_exec($ch);
$info = curl_getinfo($ch); //Some information on the fetch
curl_close($ch);
$info将有最终目的地的网址,例如www.example2.com。我希望我的理解是正确的。如果不对,请告诉我!
我的主要问题是,cURL能够知道所有类型的重定向吗?Apache重定向,javascript重定向,表单提交重定向,meta-refresh重定向!?
更新 感谢@ceejayoz和@Josso的回答。那么,有没有一种通过php以编程方式跟随所有重定向的方法?

你是否包括所有的JavaScript和meta refresh?meta refresh是可行的。 - ajreal
@ajreal:JavaScript 也是可以的(http://pecl.php.net/package/spidermonkey),只是需要付出不可接受的努力。 - mario
5个回答

9

cURL不会跟随JS或meta标签重定向。


那么,有没有一种方法可以通过PHP编程自动跟踪所有重定向呢? - jtanmay
可能不是一种可靠的方法。你可以相对容易地解析出 meta refresh,但使用 JS 有很多种方式,包括调用外部的 .js 文件,以至于你可能永远无法可靠地捕捉到它们。 - ceejayoz

3
我知道我的回答有点晚了,但是我遇到了类似的问题,需要更多的内容,而不仅仅是遵循HTTP 301/302状态重定向。因此,我编写了一个小型库,也会遵循rel = canonical和og:url元标记。 https://github.com/mattwright/URLResolver.php 我发现meta refresh标签并没有提供太多好处,但如果未返回head或body html标记,则会使用它们。

1
非常感谢你,Matt。我很感激你的努力。 - Nishant Ghodke

1

我刚在php网站上找到这个。它解析响应以查找重定向并跟随它们。我认为它不能获取每种类型的重定向,但它非常接近。

http://www.php.net/manual/en/ref.curl.php#93163

我可以把它复制在这里,但我不想剽窃。


1
据我所知,它只会遵循HTTP标头重定向(301和302)。

1

curl是一个多协议库,提供了一些HTTP支持,但在您的情况下并没有太多帮助。您可以手动扫描meta refresh标签来解决问题。

但更好的想法是查看PEAR HTTP_Request或Zend_Http类,它们很可能已经提供了类似的功能。phpQuery也可能相关,因为它带有自己的http函数,但如果需要,可以轻松地->find("meta[refresh]")。或者寻找类似于Mechanize的浏览器类:是否有Perl的WWW::Mechanize的PHP等效类?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接