curl이 * 빈 응답 *을받을 때 연결 문제를 해결하는 방법


27

웹 서버에 대한 컬 요청이 작동하지 않는 이유를 해결하는 방법을 알고 싶습니다. 나는 내 환경에 의존 할 수있는 도움을 찾지 않고, 통신의 어떤 부분이 실패했는지, 포트 번호 등을 정확히 수집하는 방법을 알고 싶습니다.

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에서 더 구체적인 정보를 얻을 수 있습니까?

성공적으로 "연결"할 수 있었으므로 양방향 통신이 필요하지 않습니까? 그렇다면 왜 응답이 나오지 않습니까? 서비스가 작동하고 응답을 반환한다는 것을 확인했습니다.

이 네트워킹 수준에서는 약간 초록색이므로 일반적인 방향 자료를 자유롭게 제공하십시오.


1
같은 오류가 발생했지만 제 경우에는 특정 네트워크 트래픽을 가로 채서 차단하는 VPN 소프트웨어였습니다. 자세한 내용은 여기를 참조하십시오 : stackoverflow.com/a/24189367/703200
Chris Bartley

답변:


16

클라이언트 쪽이 아닌 서버 쪽에서이 문제를 해결해야 할 수도 있습니다. 나는 당신이 '빈 응답'과 '응답 없음'을 혼동하고 있다고 생각합니다. 그들은 같은 것을 의미하지 않습니다. 데이터가 포함되지 않은 회신을받는 것 같습니다.

curl을 거치지 않고 텔넷을 사용하여 간단히 테스트 할 수 있습니다.

telnet 111.222.159.30 80

연결되면 컬 출력에서 ​​가져온 다음을 붙여 넣습니다.

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: */*

다른 클라이언트에서 페이지를 성공적으로 다시 가져올 수 있습니다. 클라이언트가 작동하는 특정 네트워크에만 해당됩니다.
차드

그리고, 빈 응답 = 무 반응에 관해서는, 나는에서 것을 가지고 stackoverflow.com/questions/5929971/... ,하지만 난 다른 의견을 고려 기꺼이)
차드

1
여전히 서버 쪽에서 문제를 해결해야합니다. 서버가 데이터를 보내지 않으면 클라이언트는 이유를 알 수 없습니다. 그것을 얻지 못했다는 것만 알고 있습니다. empty vs no에 관해서는, 컬이 '빈'응답에 대해 불평하는 서버를 발견했으며 확실히 응답을 받았습니다. * Empty reply from servercurl에서 연결하면 모든 관련 http 헤더가 순수하게로 구성된 본문과 직접 ​​표시됩니다 <!-- b5 -->. 특정 네트워크가 아닌 다른 곳에서 curl으로 작동하는 경우 해당 네트워크의 차이점을 살펴 보겠습니다. 아마도 행동이 좋지 않은 프록시일까요?
yoonix

7

컬은 괜찮지 만 문제가 발생했을 때 많은 피드백을 제공하지 않습니다. wget이 더 많은 정보를 제공 할 수 있지만 yoonix가 언급했듯이 서버 측 (예 : 웹 서버 오류 로그)이 찾아야 할 곳입니다.

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

당신은뿐만 아니라 호스트 이름을 설정할 수 있습니다

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

2

이것을 시도 하십시오 -> cURL을 거치지 말고 Telnet으로 접속하려는 사이트를 핑하십시오. 연결 시도가 반환하는 응답은 cURL이 연결을 시도 할 때 표시되는 것과 정확히 일치하지만 (도움이되지 않으면 서 난독하게 처리합니다). 이제 여기에 보이는 내용에 따라 몇 가지 결론 중 하나를 그릴 수 있습니다.

이름 기반 가상 호스트 인 웹 사이트에 연결하려고합니다. 즉, IP 주소를 통해 연결할 수 없습니다. 호스트 이름에 문제가 있습니다. 잘못 입력했을 수 있습니다. 매개 변수에 POST 대신 GET을 사용하면보다 구체적인 답변을 얻을 수 있습니다.

이 문제는 100- 연속 헤더와 관련이있을 수도 있습니다. curl_getinfo ($ ch, CURLINFO_HTTP_CODE)를 실행하고 결과를 확인하십시오.


1
참고 (다른 cURL 질문 에이 답변을 게시 한 것을 보았으므로) : 이러한 질문은 cURL, CLI 바이너리에 관한 것이며 참조하는 PHP 래퍼 구현이 아닙니다. 다시 말해 getinfoCLI cURL에 대한 플래그 나 기능은 없습니다 . @see curl.haxx.se

0

경우에 따라 Windows의 WSL 하에서. bash 내에서 curl을 실행하면 동일한 오류가 발생하며 이는 Kasperksy가 HTTP / s에 연결하는 것을 차단하기 때문입니다.

이 버그는 여기 에서보고 되었습니다 .

빠른 해결책은 서버에서 연결하려는 포트에서 Kaspersky의 보호 기능을 비활성화하는 것입니다 (예 : TCP 80).

Kaspersky-설정-네트워크 설정- "모니터 선택한 포트만"확인-포트 선택-포트 (80)에서 이중 클리크를 선택하고 비활성을 선택하면됩니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.