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