2009-06-13 5 views
3

Ich erstelle mit cURL einen grundlegenden Link Checker bei der Arbeit. Meine Anwendung hat eine Funktion namens getHeaders(), die eine Reihe von HTTP-Header zurückgibt:Verwechslung mit mail.google.com, cURL und http://validator.w3.org/checklink

function getHeaders($url) { 

    if(function_exists('curl_init')) { 
     // create a new cURL resource 
     $ch = curl_init(); 
     // set URL and other appropriate options 
     $options = array(
      CURLOPT_URL => $url, 
      CURLOPT_HEADER => true, 
      CURLOPT_NOBODY => true, 
      CURLOPT_FOLLOWLOCATION => 1, 
      CURLOPT_RETURNTRANSFER => true); 
     curl_setopt_array($ch, $options); 
     // grab URL and pass it to the browser 
     curl_exec($ch); 
     $headers = curl_getinfo($ch); 
     // close cURL resource, and free up system resources 
     curl_close($ch); 
    } else { 
     echo "

Error: cURL is not installed on the web server. Unable to continue.

"; return false; } return $headers; } print_r(getHeaders('mail.google.com'));

, die die folgenden Ergebnisse liefert:

Array 
(
    [url] => http://mail.google.com 
    [content_type] => text/html; charset=UTF-8 
    [http_code] => 404 
    [header_size] => 338 
    [request_size] => 55 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 0 
    [total_time] => 0.128 
    [namelookup_time] => 0.042 
    [connect_time] => 0.095 
    [pretransfer_time] => 0.097 
    [size_upload] => 0 
    [size_download] => 0 
    [speed_download] => 0 
    [speed_upload] => 0 
    [download_content_length] => 0 
    [upload_content_length] => 0 
    [starttransfer_time] => 0.128 
    [redirect_time] => 0 
)

ich es mit mehreren langen Links getestet haben und die Funktion erkennt Weiterleitungen an, abgesehen von mail.google.com.

Für Spaß, habe ich die gleiche URL (mail.google.com) an das W3C Link-Checker, die produziert:

Results 

Links 

Valid links! 

List of redirects 

The links below are not broken, but the document does not use the exact URL, and the links were redirected. It may be a good idea to link to the final location, for the sake of speed. 

warning Line: 1 http://mail.google.com/mail/ redirected to 

https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&bsv=zpwhtygjntrz&scc=1&ltmpl=default&ltmplcache=2 

Status: 302 -> 200 OK 

This is a temporary redirect. Update the link if you believe it makes sense, or leave it as is. 

Anchors 

Found 0 anchors. 

Checked 1 document in 4.50 seconds.

Was ist richtig, wie die Adresse oben ist, wo ich bin umgeleitet, wenn Ich gebe mail.google.com in meinen Browser ein.

Welche cURL-Optionen müsste ich verwenden, um die Funktion 200 für mail.google.com zurückzugeben?

Warum gibt die obige Funktion den Statuscode 404 im Gegensatz zu 302 Statuscode zurück?

TIA

Antwort

0

Könnte es sein, dass

mail.google.com -> mail.google.com/mail is a 404 and then a hard redirect 

und

mail.google.com/mail -> https://www.google.com/accounts... etc is a 302 redirect 
4

Das Problem ist, dass die Umleitung durch Methoden angegeben, die cURL nicht folgen. Hier

ist die Antwort von http://mail.google.com:

HTTP/1.1 200 OK 
Cache-Control: public, max-age=604800 
Expires: Mon, 22 Jun 2009 14:58:18 GMT 
Date: Mon, 15 Jun 2009 14:58:18 GMT 
Refresh: 0;URL=http://mail.google.com/mail/ 
Content-Type: text/html; charset=ISO-8859-1 
X-Content-Type-Options: nosniff 
Transfer-Encoding: chunked 
Server: GFE/1.3 

<html> 
<head> 
    <meta http-equiv="Refresh" content="0;URL=http://mail.google.com/mail/" /> 
</head> 
<body> 
    <script type="text/javascript" language="javascript"> 
    <!-- 
    location.replace("http://mail.google.com/mail/") 
    --> 
    </script> 
</body> 
</html> 

Wie Sie sehen können, die Seite verwendet sowohl einen Refresh-Header (und HTML-Meta-Äquivalent) und Javascript im Körper Standort http://mail.google.com/mail/ zu ändern.

Wenn Sie dann http://mail.google.com/mail/ anfordern, werden Sie (mit dem Location-Header, dem cURL folgt) auf die Seite weitergeleitet, die Sie zuvor erwähnt haben, die W3C korrekt identifiziert.

HTTP/1.1 302 Moved Temporarily 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: Fri, 01 Jan 1990 00:00:00 GMT 
Date: Mon, 15 Jun 2009 15:07:56 GMT 
Location: https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&bsv=zpwhtygjntrz&scc=1&ltmpl=default&ltmplcache=2 
Content-Type: text/html; charset=UTF-8 
X-Content-Type-Options: nosniff 
Transfer-Encoding: chunked 
Server: GFE/1.3 

HTTP/1.1 200 OK 
Content-Type: text/html; charset=UTF-8 
Cache-control: no-cache, no-store 
Pragma: no-cache 
Expires: Mon, 01-Jan-1990 00:00:00 GMT 
Set-Cookie: GALX=B8zH60M78Ys;Path=/accounts;Secure 
Date: Mon, 15 Jun 2009 15:07:56 GMT 
X-Content-Type-Options: nosniff 
Content-Length: 19939 
Server: GFE/2.0 

(HTML page content here, removed) 

Vielleicht sollten Sie einen zusätzlichen Schritt in Ihrem Skript hinzufügen, um nach einem Refresh-Header zu suchen.

Ein weiterer möglicher Fehler ist, dass Sie open_basedir in Ihrer PHP-Konfiguration gesetzt haben, was CURLOPT_FOLLOWLOCATION deaktivieren würde - Sie können dies schnell überprüfen, indem Sie Fehlerberichte aktivieren, da eine Nachricht entweder als Warnung oder Hinweis generiert wird.

Die Ergebnisse vor allem mit folgenden cURL Setup erhalten:

$useragent="Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5"; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$res = curl_exec($ch); 

curl_close($ch); 
Verwandte Themen