Mail.google.com, cURL ve http://validator.w3.org/checklink ile karışıklık

2 Cevap php

Ben cURL kullanarak iş yerinde temel bir bağlantı ekose desenli inşa ediyorum. Benim uygulama HTTP başlıklarını bir dizi döndürür getHeaders adında bir function () vardır:

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 "

Hata: cURL web sunucusunda yüklü değil. Devam edemiyor.

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

Hangi aşağıdaki sonuçları verir:

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
)

Ben birkaç uzun bağlantıları ile test ettik, ve fonksiyon dışında tüm görünüyor mail.google.com gelen yönlendirmeleri kabul eder.

Eğlenmek için, ben üretilen W3C bağlantı denetleyicisi, aynı URL (mail.google.com) geçti:

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<mpl=default<mplcache=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.

Yukarıdaki adres benim tarayıcı içine mail.google.com girerken ben yönlendirildi nerede olduğu gibi, doğru olan.

Ne cURL seçenekleri benim işlevi mail.google.com için 200 dönmek yapmak için kullanmak gerekir?

Neden 302 durum koduna karşıt olarak işlev yukarıda 404 durum kodunu döndürür olduğunu?

TIA

2 Cevap

Sorun yönlendirme cURL takip etmeyecek yöntemlerle belirlenmiş olmasıdır.

İşte gelen yanıttır 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>

Gördüğünüz gibi, sayfa http://mail.google.com/mail/ için konumunu değiştirmek için vücutta bir Refresh başlık (ve HTML meta eşdeğer) ve javascript hem de kullanır.

Eğer http://mail.google.com/mail/, sen sayfaya (cURL aşağıdaki Location başlığı ile) yönlendirileceksiniz istiyorsa önce W3C doğru tanımlar söylemiştik.

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)

Belki bir Refresh başlık için kontrol etmek için komut ek bir adım eklemek gerekir.

Bir mesajı bir uyarı ya da bildirimde ya olarak oluşturulur gibi, hata raporlama açarak hızlı bir şekilde bu kontrol edebilirsiniz - Başka bir olası hata open_basedir CURLOPT_FOLLOWLOCATION devre dışı edeceğini PHP yapılandırmasında, ayarlanmış olması.

Yukarıda sonuçları tüm aşağıdaki cURL kurulum ile elde edilmiştir:

$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);

Bundan olabilir

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

ve

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