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

  1. 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:

  1. redirected.php

W jego treści wpiszmy.:

  1. <h1>To jest plik 'redirected.php'. Zostałeś automatycznie przekierowany</h1>

Następnie w pliku server.php dodajmy na początku:

  1. <?php
  2.  
  3. header("Location: redirected.php");
  4.  
  5. exit;

Wejdźmy teraz do naszego client.php:

  1. http://localhost/client.php

i wykonajmy standardowe połączenie:

  1. <?php
  2.  
  3. // do tej tablicy odbierzemy nagłówki
  4.  
  5. $return_headers = [];
  6.  
  7. $errors = '';
  8.  
  9.  
  10.  
  11. // funkcja odbierająca nagłówki
  12.  
  13. function headerLine($curl, $header_line ) {
  14.  
  15.     $GLOBALS['return_headers'][] = $header_line;
  16.  
  17.     return strlen($header_line);
  18.  
  19. }
  20.  
  21.  
  22.  
  23. // definiujemy URL do pliku 'server.php'
  24.  
  25. $url_to_server = 'http://localhost/server.php';
  26.  
  27.  
  28.  
  29. // inicjujemy sesję połączenia
  30.  
  31. $ch = curl_init($url_to_server);
  32.  
  33.  
  34.  
  35. // ustawiamy opcje
  36.  
  37. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
  38.  
  39. curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka
  40.  
  41.  
  42.  
  43. // wykonujemy połączenie
  44.  
  45. $response_body = curl_exec($ch);
  46.  
  47.  
  48.  
  49. // pobieramy błąd, jeśli wystąpi
  50.  
  51. if (curl_errno($ch))  $errors.= '<h2>Error #' . curl_errno($ch) . ': ' . curl_error($ch).'</h2>';
  52.  
  53.  
  54.  
  55. // zamykamy sesję połączenia
  56.  
  57. curl_close($ch);
  58.  
  59. ?>


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:

  1. curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);

i wykonajmy drugie połączenie:

  1. <?php
  2.  
  3. // do tej tablicy odbierzemy nagłówki
  4.  
  5. $return_headers = [];
  6.  
  7. $errors = '';
  8.  
  9.  
  10.  
  11. // funkcja odbierająca nagłówki
  12.  
  13. function headerLine($curl, $header_line ) {
  14.  
  15.     $GLOBALS['return_headers'][] = $header_line;
  16.  
  17.     return strlen($header_line);
  18.  
  19. }
  20.  
  21.  
  22.  
  23. // definiujemy URL do pliku 'server.php'
  24.  
  25. $url_to_server = 'http://localhost/server.php';
  26.  
  27.  
  28.  
  29. // inicjujemy sesję połączenia
  30.  
  31. $ch = curl_init($url_to_server);
  32.  
  33.  
  34.  
  35. // ustawiamy opcje
  36.  
  37. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // chcemy odebrać dane
  38.  
  39. curl_setopt($ch, CURLOPT_HEADERFUNCTION, "headerLine"); // ustawiamy własną funkcję do przetworzenia nagłówka
  40.  
  41.  
  42.  
  43. // ustawmy podążanie za przekierowaniami:
  44.  
  45. curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
  46.  
  47.  
  48.  
  49. // wykonujemy połączenie
  50.  
  51. $response_body = curl_exec($ch);
  52.  
  53.  
  54.  
  55. // pobieramy błąd, jeśli wystąpi
  56.  
  57. if (curl_errno($ch))  $errors.= '<h2>Error #' . curl_errno($ch) . ': ' . curl_error($ch).'</h2>';
  58.  
  59.  
  60.  
  61. // zamykamy sesję połączenia
  62.  
  63. curl_close($ch);
  64.  
  65. ?>


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