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ę:
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









God of War Benzeri Oyunlar
OdpowiedzUsuńAsetto Benzeri Oyunlar
Dream League Soccer Benzeri Oyunlar
Days Gone Benzeri Oyunlar
TFT Benzeri Oyunlar
LRV3Y
Siirt
OdpowiedzUsuńTekirdağ
Çorum
Bayburt
Muş
Kastamonu
Kırşehir
Osmaniye
Kayseri