Назад | Перейти на главную страницу

Как устранить неполадки с подключением, когда curl получает * пустой ответ *

Я хочу знать, как действовать при устранении неполадок, почему запрос curl на веб-сервер не работает. Я не ищу помощи, которая зависела бы от моей среды, я просто хочу знать, как собирать информацию о том, какая именно часть связи дает сбой, номера портов и т. Д.

chad-integration:~ # curl -v 111.222.159.30
* About to connect() to 111.222.159.30 port 80 (#0)
*   Trying 111.222.159.30... connected
* Connected to 111.222.159.30 (111.222.159.30) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
> Host: 111.222.159.30
> Accept: */*
> 
* Empty reply from server
* Connection #0 to host 111.222.159.30 left intact
curl: (52) Empty reply from server
* Closing connection #0

Итак, я понимаю, что пустой ответ означает, что curl не получил ответа от сервера. Нет проблем, это именно то, что я пытаюсь выяснить.

Но какую более конкретную информацию я могу получить здесь из cURL?

Он смог успешно «подключиться», так разве это не предполагает двунаправленной связи? Если да, то почему тоже не приходит ответ? Обратите внимание: я подтвердил, что моя служба работает, и я возвращаю ответы.

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

Скорее всего, вам потребуется устранять неполадки на стороне сервера, а не на стороне клиента. Я считаю, что вы путаете «пустой ответ» с «без ответа». Они не означают одно и то же. Вероятно, вы получаете ответ, не содержащий данных.

Вы можете проверить это, просто используя telnet вместо curl:

telnet 111.222.159.30 80

После подключения вставьте следующее (взято из вывода curl):

GET / HTTP/1.1
User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
Host: 111.222.159.30
Accept: */*

Вы должны увидеть ответ точно так, как его видит curl.

Одна из возможных причин, по которой вы получаете пустой ответ, заключается в том, что вы пытаетесь перейти на веб-сайт, который является виртуальным хостом на основе имени. В этом случае, в зависимости от конфигурации сервера (сайт, на который вы пытаетесь попасть, настроен по умолчанию), вы не сможете получить доступ к сайту по IP-адресу без небольшой работы.

Вы можете проверить это на стороне клиента, просто изменив строку «Хост» выше; замените www.example.com сайтом, на который вы пытаетесь перейти:

GET / HTTP/1.1
User-Agent: curl/7.19.0 (x86_64-suse-linux-gnu) libcurl/7.19.0     OpenSSL/0.9.8h zlib/1.2.3 libidn/1.10
Host: www.example.com
Accept: */*

Curl - это хорошо, но не дает особой обратной связи, когда что-то идет не так. (Как вы понимаете) wget может предоставить вам дополнительную информацию, но, как упоминает yoonix, серверная сторона (то есть журналы ошибок веб-сервера) - это то место, куда нужно смотреть.

wget -S -O /dev/null http://www.example.com

Вы также можете установить имена хостов с помощью

wget -s -O /dev/null --header="Host: foo.bar" http://www.example.com

Пытаться этот -> Вместо того, чтобы использовать cURL, попробуйте проверить связь с сайтом, на который вы пытаетесь попасть, с помощью Telnet. Ответ, который возвращает ваша попытка подключения, будет именно тем, что cURL видит, когда пытается подключиться (но который он бесполезно скрывает от вас). Теперь, в зависимости от того, что вы здесь видите, вы можете сделать один из нескольких выводов:

Вы пытаетесь подключиться к веб-сайту, который является виртуальным хостом на основе имени, то есть к нему нельзя получить доступ через IP-адрес. Что-то пошло не так с именем хоста - возможно, вы что-то ошиблись. Обратите внимание, что использование GET вместо POST для параметров даст вам более конкретный ответ.

Проблема также может быть связана с заголовком 100-continue. Попробуйте запустить curl_getinfo ($ ch, CURLINFO_HTTP_CODE) и проверьте результат.

В некоторых случаях под Windows WSL. Запуск curl внутри bash вызовет ту же ошибку, потому что Kasperksy блокирует его подключение к HTTP / s.

Об этой ошибке сообщили Вот.

Быстрое решение - отключить защиту Касперского на порту, к которому вы пытаетесь подключиться на сервере (например, tcp 80).

Для этого зайдите в Kaspersky - Настройки - Настройки сети - установите флажок «Мониторинг только выбранных портов» - выберите порты - дважды щелкните порт (80) и выберите неактивный.