Следуйте за редиректами в cURL

Утилита cURL - это программа командной строки, часто связанная с дистрибутивами Unix / Linux и операционными системами Mac OSX. Он позволяет отправлять практически любой тип HTTP-запроса через командную строку, что отлично подходит для многих вещей, начиная от отправки данных в REST API и заканчивая загрузкой файлов. HTTP-серверы очень часто возвращают перенаправление 301 или 302 для заданного URL-адреса. Одним из распространенных примеров этого является перенаправление вашего браузера с URL-адреса HTTP на HTTPS, например http://stackabuse.com на https:

Утилита cURL - это программа командной строки, часто связанная с дистрибутивами Unix / Linux и операционными системами Mac OSX. Он позволяет отправлять практически любой тип HTTP-запроса через командную строку, что отлично подходит для многих вещей, начиная от отправки данных в REST API и заканчивая загрузкой файлов.

HTTP-серверы очень часто возвращают перенаправление 301 или 302 для заданного URL-адреса. Одним из распространенных примеров этого является перенаправление вашего браузера с URL-адреса HTTP на HTTPS, например http://stackabuse.com на https://stackabuse.com . Используя cURL, мы можем увидеть, как на самом деле выглядит это перенаправление:

 $ curl -i http://stackabuse.com 
 HTTP/1.1 301 Moved Permanently 
 Date: Thu, 18 Apr 2019 02:11:32 GMT 
 Transfer-Encoding: chunked 
 Connection: keep-alive 
 Cache-Control: max-age=3600 
 Expires: Thu, 18 Apr 2019 03:11:32 GMT 
 Location: https://stackabuse.com/ 

Обратите внимание, что я использовал -i чтобы он распечатал заголовки ответа на запрос.

При использовании в сценариях Bash или запуске cURL через командную строку вручную вы не захотите обрабатывать эти перенаправления вручную, иначе это может добавить много ненужной логики в ваш сценарий. Из-за этого cURL предлагает флаг командной строки, который сообщает ему автоматически следовать перенаправлению и возвращать разрешенную конечную точку и ее данные:

 $ curl -L [url] 

Выполнение этой команды автоматически обработает любые перенаправления 3XX и получит все данные, возвращаемые результирующим URL.

Вот тот же запрос сверху, но с -L (который является псевдонимом для --location ) для отслеживания перенаправлений:

 $ curl -iL http://stackabuse.com 
 HTTP/1.1 301 Moved Permanently 
 Date: Thu, 18 Apr 2019 02:17:42 GMT 
 Transfer-Encoding: chunked 
 Connection: keep-alive 
 Cache-Control: max-age=3600 
 Expires: Thu, 18 Apr 2019 03:17:42 GMT 
 Location: https://stackabuse.com/ 
 
 HTTP/1.1 200 OK 
 Date: Thu, 18 Apr 2019 02:17:42 GMT 
 Content-Type: text/html; charset=utf-8 
 Transfer-Encoding: chunked 
 Connection: keep-alive 
 domain=.stackabuse.com; HttpOnly; Secure 
 Cache-Control: public, max-age=3600 
 Vary: Accept-Encoding 
 P3P: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV" 
 Expires: Thu, 18 Apr 2019 03:17:42 GMT 
 
 <!DOCTYPE html> 
 <html lang="en"> 
 ... 
 </html> 

Обратите внимание: поскольку мы сохранили -i он показал нам заголовки для каждого из сделанных запросов в дополнение к окончательному HTML, возвращенному сервером, который был сокращен для краткости.

Ограничение перенаправлений

Но что, если запрашиваемый URL-адрес перенаправляет на другой URL-адрес, который возвращает перенаправление? Нередко можно выполнить несколько последовательных перенаправлений, прежде чем попасть в конечный пункт назначения.

Например, допустим, на моем сервере действуют следующие правила:

  • Перенаправление с HTTP на HTTPS
  • Перенаправить с example.com на www.example.com
  • Перенаправление от / о нас к / о нас
  • Перенаправить с косой черты без косой черты на конечную косую черту

С учетом этих правил, если мы отправим запрос на http://example.com/about мы получим 4 перенаправления и в конечном итоге окажемся на https://www.example.com/about-us/ . Хотя на самом деле это не так много перенаправлений, вы можете себе представить, что можно встретить гораздо больше.

А что, если два URL-адреса постоянно перенаправляют друг на друга? Тогда вы застрянете в бесконечном цикле перенаправления. У cURL есть способ справиться с этим, обеспечив максимальное количество перенаправлений, которое он будет выполнять, по умолчанию 50. Используя параметр --max-redirs вы можете установить это число в соответствии с вашим вариантом использования.

Итак, используя наш вымышленный пример сверху, если мы установим максимальное количество перенаправлений равным 1, мы увидим такую ошибку:

 $ curl -iL --max-redirs 1 http://example.com 
 HTTP/1.1 301 Moved Permanently 
 Date: Thu, 18 Apr 2019 02:39:59 GMT 
 Transfer-Encoding: chunked 
 Connection: keep-alive 
 Location: https://example.com/about 
 
 HTTP/1.1 301 Moved Permanently 
 Date: Thu, 18 Apr 2019 02:39:59 GMT 
 Transfer-Encoding: chunked 
 Connection: keep-alive 
 Location: https://www.example.com/about 
 P3P: CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV" 
 
 curl: (47) Maximum (1) redirects followed 

С другой стороны, если вам вообще не нужен лимит, просто установите его на -1.

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus