我正在使用cURL库开发php应用程序。
我想获取重定向网址(如果是301或302 http代码)。在Windows中它很简单,我只需要调用curl_getinfo($ ch)。此方法返回带有redirect_url的关联数组,我稍后会使用它。
当我将应用程序移动到linux服务器时,我遇到了问题。这样的方法(curl_getinfo)也返回数组,但是没有“redirect_url”索引。我虽然可以尝试将标题读作字符串。我设置了
curl_setopt(CURLOPT_HEADERFUNCTION, callback)
并将响应标头保存为字符串。然后我使用简单的解析器来获取我感兴趣的字段。但现在我有另一个问题。重定向url(http标头LOCATION)返回相对url(而在Windows中它是绝对的)。
为什么windows cURL和linux有区别?我该怎么做才能使这个应用程序抵抗操作系统的变化?最后,我怎样才能将这个字段(重定向url)作为linux中的绝对url。
感谢您的帮助:)
来自Windows的示例:
Array
(
[url] => http:// wiadomosci.wp.pl/kat,1342,title,Ciag-dalszy-sporu-wokol-poslow-PiS-Nie-moge-tego-zrobic,wid,13927471,wiadomosc.html
[content_type] => text/html
[http_code] => 302
[header_size] => 2407
[request_size] => 384
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.046
[namelookup_time] => 0
[connect_time] => 0.015
[pretransfer_time] => 0.015
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => 0
[starttransfer_time] => 0.046
[redirect_time] => 0
[certinfo] => Array
(
)
[redirect_url] => http:// wiadomosci.wp.pl/kat,1342,title,Ciag-dalszy-sporu-wokol- poslow-PiS-Nie-moge-tego-zrobic,wid,13927471,wiadomosc.html?ticaid=1d436
)
和windows:
Array
(
[url] => http:// wiadomosci.wp.pl/kat,1342,title,Ciag-dalszy-sporu-wokol-poslow-PiS-Nie-moge-tego-zrobic,wid,13927471,wiadomosc.html
[content_type] => text/html
[http_code] => 302
[header_size] => 2425
[request_size] => 384
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0.023254
[namelookup_time] => 0.001938
[connect_time] => 0.004836
[pretransfer_time] => 0.004847
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => 0
[starttransfer_time] => 0.023068
[redirect_time] => 0
[certinfo] => Array
(
)
)
答案 0 :(得分:1)
有一种替代解决方案适用于每个(当前支持的)操作系统。
您可以要求curl遵循重定向并将其限制为一个深度,然后使用curl_getinfo($ ch)中的url键;
示例:
<?php
$url = 'http://jigsaw.w3.org/HTTP/300/301.html';
$expectedUrl = 'http://jigsaw.w3.org/HTTP/300/Overview.html';
$ch = curl_init();
curl_setopt( $ch, CURLOPT_URL, $url );
curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
curl_setopt( $ch, CURLOPT_MAXREDIRS, 1);
$content = curl_exec( $ch );
$response = curl_getinfo( $ch );
curl_close ( $ch );
if ($response['url'] == $expectedUrl)
echo "I have the correct redirect url\n";
else
echo "I do not have the correct redirect url\n";
如果您只想要结束网址,无论可能有多少重定向,您都可以删除CURLOPT_MAXREDIRS选项(或将其设置为高以防止循环)