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ę:
- curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
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:
- redirected.php
W jego treści wpiszmy.:
- <h1>To jest plik 'redirected.php'. Zostałeś automatycznie przekierowany</h1>
Następnie w pliku server.php dodajmy na początku:
- <?php
- header("Location: redirected.php");
- exit;
Wejdźmy teraz do naszego client.php:
- http://localhost/client.php
i wykonajmy standardowe połączenie:
- <?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);
- ?>
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:
- curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
i wykonajmy drugie połączenie:
- <?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);
- ?>
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