Использование cURL Header в PHP

Заголовки HTTP-запросов несут в себе важную информацию для сервера. Они позволяют настраивать параметры запроса, передавать данные в теле, аутентифицировать пользователя. В статье мы рассмотрим, как использовать библиотеку cURL в PHP для отправки запросов с кастомными заголовками.

Основы работы с заголовками в cURL

Заголовки HTTP представляют собой строки текста, которые передаются в запросах и ответах протокола HTTP между клиентом и сервером. Они несут различную служебную информацию, позволяющую корректно обработать запрос и подготовить ответ.

Рассмотрим наиболее важные заголовки:

  • User-Agent - идентифицирует клиентское приложение (браузер, скрипт)
  • Referer - адрес предыдущей страницы, откуда последовал переход
  • Authorization - данные для аутентификации пользователя
  • Content-Type - тип данных в теле запроса (JSON, форма и т.д.)
  • Accept - форматы ответа, поддерживаемые клиентом (HTML, JSON и т.д.)

Для работы с заголовками в PHP используется библиотека cURL. Основные функции:

  • curl_init() - инициализировать новый сеанс cURL
  • curl_setopt() - установка параметров запроса
  • curl_exec() - отправка запроса и получение ответа
  • curl_getinfo() - получение информации о запросе
  • curl_close() - закрытие сеанса cURL

Для установки заголовков запроса используется параметр CURLOPT_HTTPHEADER. Ему передается массив строк с именами и значениями заголовков:

 $headers = [ 'User-Agent: MyUserAgent', 'Accept: application/json', ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

Рассмотрим пример установки некоторых распространенных заголовков запроса в cURL:

User-Agent

 curl_setopt($ch, CURLOPT_USERAGENT, 'MyCustomUserAgent 1.0'); 

Referer

 $referer = 'https://example.com/previous'; curl_setopt($ch, CURLOPT_REFERER, $referer); 

Content-Type

 $data = ['key' => 'value']; // данные запроса curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); 

После отправки запроса методом curl_exec(), заголовки ответа сервера будут содержаться в переменной $response. Чтобы получить только заголовки ответа, необходимо установить параметр CURLOPT_HEADER:

 curl_setopt($ch, CURLOPT_HEADER, true); $response = curl_exec($ch); // только заголовки 

Также важно правильно обрабатывать ошибки cURL запросов. Функция curl_error($ch) вернет текст последней ошибки. Код ответа сервера можно получить с помощью curl_getinfo($ch, CURLINFO_HTTP_CODE):

 if(curl_errno($ch)) { echo 'Ошибка: ' . curl_error($ch); } $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); if ($code >= 400) { echo 'Неверный ответ сервера: ' . $code; } 

Таким образом, мы рассмотрели основные способы работы с заголовками HTTP в библиотеке cURL PHP - их установку и получение, отправку запросов и обработку ошибок. Далее перейдем к более продвинутым возможностям.

Расширенные возможности заголовков

Помимо установки базовых заголовков запроса, cURL позволяет решать более сложные задачи:

  • Работа с cookie
  • Аутентификация пользователей
  • Защита от парсинга сайтов
  • Использование прокси-серверов
  • Отправка пакетных и многопоточных запросов

Работа с cookie

Для сохранения и передачи куки между запросами в cURL используются параметры CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR:

 curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt'); // чтение curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt'); // сохранение // куки будут автоматически сохраняться и отправляться между запросами 

Аутентификация пользователей

Для аутентификации на веб-сервере в cURL можно использовать несколько механизмов:

Basic auth

 $login = 'mylogin'; $pass = 'mypass'; curl_setopt($ch, CURLOPT_USERPWD, "$login:$pass"); 

Digest auth

 $login = 'mylogin'; $pass = 'mypass'; curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); curl_setopt($ch, CURLOPT_USERPWD, "$login:$pass"); 

Также возможна аутентификация с помощью протоколов OAuth, Auth0 и других. Для этого заголовок Authorization формируется в специальном формате.

Защита от парсинга сайтов

Чтобы обойти некоторые методы защиты от парсинга, можно подменить заголовки User-Agent, Accept, Accept-Language, чтобы сервер считал запрос выполненным из браузера.

 $headers = [ 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3' ]; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

Однако при использовании Javascript и продвинутой защиты этого может быть недостаточно.

Работа через прокси

Чтобы выполнить запросы через прокси-сервер, в cURL можно указать его адрес и порт:

 $proxy = 'Proxy_IP:Proxy_Port'; curl_setopt($ch, CURLOPT_PROXY, $proxy); 

При необходимости также можно задать параметры аутентификации на прокси-сервере.

В целом, у cURL есть гибкие средства для решения различных задач при работе с заголовками HTTP. Это позволяет использовать библиотеку для реализации взаимодействия с веб-серверами в PHP сценариях.

Комментарии