czwartek, 21 maja 2015

[PHP][cURL] Podstawy cz.5 - obsługa przekierowań

TRUE
4123571317394950562
Bardzo często odwołując się do danego zasobu zostajemy przekierowani w inne miejsce często nawet tego nie zauważając. W przypadku takim wysyłany jest przez serwer kod statusu z klasy 3xx, mówiący o typie danego przekierowania. Przekierowania takie często tworzymy sami, wywołując pehapową funkcję header("Location: /przekierowanie/do/")

Przekierowanie to zwraca zwraca do klienta kod statusu 302 Found, zamiast 200 OK. Kod 200 OK wysyłany jest dopiero po nastąpieniu przekierowania do wywoływanego w Location: pliku.  Biblioteka cURL domyślnie nie podąża za takimi przekierowaniami, a odbiera jedynie nagłówek informujący o istnieniu przekierowania. Aby zmienić zachowanie cURL-a i nakazać mu podążanie za takimi przekierowaniami, musimy ustawić następującą opcję:
[code]curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);[/code]
Przetestujmy to na przykładzie. Najpierw z nieustawionym podążaniem za przekierowaniem, a potem z ustawionym. W folderze na serwerze, gdzie trzymamy nasze przygotowane w części pierwszej pliki client.php i server.php stwórzmy jeszcze jeden plik o nazwie:
[code]redirected.php[/code]
W jego treści wpiszmy.:
[code]<h1>To jest plik 'redirected.php'. Zostałeś automatycznie przekierowany</h1>[/code]
Następnie w pliku server.php dodajmy na początku:
[code]<?php
header("Location: redirected.php");
exit;[/code]
Wejdźmy teraz do naszego client.php:
[code]http://localhost/client.php[/code]
i wykonajmy standardowe połączenie:
[code]<?php
// do tej tablicy odbierzemy nagłówki
$return_headers = [];
$errors = '';

// funkcja odbierająca nagłówki
function headerLine($curl, $header_line ) {
    $GLOBALS['return_headers'][] = $header_line;
    return strlen($header_line);
}

// definiujemy URL do pliku 'server.php'
$url_to_server = 'http://localhost/server.php';

// inicjujemy sesję połączenia
$ch = curl_init($url_to_server);

// ustawiamy opcje
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka

// wykonujemy połączenie
$response_body = curl_exec($ch);

// pobieramy błąd, jeśli wystąpi
if (curl_errno($ch))  $errors.= '<h2>Error #' . curl_errno($ch) . ': ' . curl_error($ch).'</h2>';

// zamykamy sesję połączenia
curl_close($ch);
?>[/code]

Zostaną zwrócone same nagłówki żądania z kodem statusu 302.
Żadne przekierowanie jednak nie nastąpi i cURL nie zwróci żadnej treści:



A teraz ustawmy opcję CURLOPT_FOLLOWLOCATION na wartość 1:
[code]curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);[/code]
i wykonajmy drugie połączenie:
[code]<?php
// do tej tablicy odbierzemy nagłówki
$return_headers = [];
$errors = '';

// funkcja odbierająca nagłówki
function headerLine($curl, $header_line ) {
    $GLOBALS['return_headers'][] = $header_line;
    return strlen($header_line);
}

// definiujemy URL do pliku 'server.php'
$url_to_server = 'http://localhost/server.php';

// inicjujemy sesję połączenia
$ch = curl_init($url_to_server);

// ustawiamy opcje
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka

// ustawmy podążanie za przekierowaniami:
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);

// wykonujemy połączenie
$response_body = curl_exec($ch);

// pobieramy błąd, jeśli wystąpi
if (curl_errno($ch))  $errors.= '<h2>Error #' . curl_errno($ch) . ': ' . curl_error($ch).'</h2>';

// zamykamy sesję połączenia
curl_close($ch);
?>[/code]

Tym razem cURL podążył za naszym przekierowaniem.
Wynik:



Warto zwrócić uwagę na fakt, iż dostaliśmy dwa pakiety nagłówków, jeden z server.php, drugi z redirected.php.


Oficjalny, pełny manual biblioteki cURL znajduje się tutaj: http://php.net/manual/en/book.curl.php

1 komentarz:

Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)

webmaester.pl - profesjonalne projektowanie WWW i webaplikacji
webmaester.pl - profesjonalne projektowanie WWW i webaplikacji