Я хочу знать, как действовать при устранении неполадок, почему запрос 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) и выберите неактивный.