Не получаю ответ на HTTP запрос запущенный в php скрипте через curl но получаю ответ в браузере, как исправить?
Доброго времени суток! Перед полноценной работой с основным скриптом пытаюсь протестировать обработку входящих GET и POST запросов, для проверки GET использую простой вывод целевого параметра subid:
<?php echo $_GET['subid']; |
<?php echo $_GET['subid'];
При обращении использую URL: https://{сервер}/?subid=42 и открывая данный адрес в браузере получаю вывод 42, все хорошо. Но к скрипту будет обращаться не браузер а php скрипт с другого веб-сервиса который посылает хук на мой эндпоинт. Запросы реализуются через curl и пример подобного GET запроса выглядит так:
<?php $get = [ 'subid' => '42' ]; $ch = curl_init('https://{сервер}?' . http_build_query($get)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $out = curl_exec($ch); curl_close($ch); echo $out; |
<?php $get = [ 'subid' => '42' ]; $ch = curl_init('https://{сервер}?' . http_build_query($get)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $out = curl_exec($ch); curl_close($ch); echo $out;
В результате приходит код 0, что по сути и не код а просто отсутствие ответа. При этом этот же скрипт проверен на другой ссылке, например публичный API (https://catfact.ninja/fact) который возвращает код 200 и JSON строку. Получается ситуация что один и тот же адрес в браузере отдает ответ а в php скрипте нет. Сам сервер на Apache, дефолтные настройки, .htaccess отсутствует на данный момент, так что пока не вижу что могло бы ограничивать работу с запросом.
Подскажите пожалуйста как можно добиться ответа на запрос из скрипта в данном случае? IDE для написания обоих скриптов PhpStorm.
Дополнительно:
У curl есть функция, возвращающая статус ответа.
Вангую, что там 301, и браузеры ваши по нему переходят, а курл - нет.
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo ('HTTP CODE ' . $code); |
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo ('HTTP CODE ' . $code);
Возвращает HTTP CODE 0
Функции получения ошибки у curl тоже есть...
Вот где собака зарыта. Будем разбираться, спасибо большое!
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); |
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
В броузере редиректов в сетевой консоли не видно ?
Ответы:
Оказалось что проблема в SSL certificate problem: unable to get local issuer certificate
Выставление CURLOPT_SSL_VERIFYPEER на 0 помогает но как решить проблему без отключения проверки сертификата?
- Курл не видит локальный сертификат.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для начала, давайте убедимся, что ваш PHP скрипт правильно настроен для отправки запросов с помощью cURL.
1. Убедитесь, что расширение cURL установлено и включено в вашем PHP. Вы можете проверить это, создав файл phpinfo.php и вставив в него следующий код:
Откройте этот файл в браузере и найдите информацию о cURL. Если расширение не установлено, вам нужно будет его установить.
2. Проверьте ваш код cURL. Убедитесь, что вы правильно настроили параметры запроса, включая URL, метод запроса, заголовки и тело запроса (если необходимо).
Пример кода для отправки GET запроса с помощью cURL:
3. Убедитесь, что ваш сервер имеет доступ к ресурсу, к которому вы пытаетесь отправить запрос. Некоторые серверы могут блокировать исходящие запросы, что может привести к ошибке при использовании cURL.
4. Попробуйте добавить дополнительные параметры CURLOPT_SSL_VERIFYPEER и CURLOPT_SSL_VERIFYHOST для обхода проблем с SSL:
Если после применения этих шагов проблема остается, попробуйте проверить логи сервера на наличие ошибок cURL или обратитесь к вашему хостинг-провайдеру для получения дополнительной помощи.