Утилита 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.