원격으로 작업하고 VPN을 통해 내부 서버에 액세스 할 수 있습니다. VPN 연결이 설정되면 curl을 통해 웹 서버에 연결할 수 있습니다.
curl http://sub.mydomain.com
로 이동하여 브라우저에서 웹 서버에 연결할 수도 있습니다 http://sub.mydomain.com
. 따라서 이것은 웹 서버 자체의 DNS 문제가 아닌 것 같습니다.
그러나 Apache를 통해 로컬로 제공되는 Laravel 4.2 애플리케이션 (PHP 5.6)을 개발할 때 php curl_exec
는 호스트를 확인하지 못합니다. 이상하게도 PHP gethostbyname($hostname)
는 호스트를 올바르게 해결합니다. IPv6을 읽었으므로 IPv4를 강제로 시도하면 이러한 유형의 실패가 성공하지 못할 수 있습니다.
// works
$ip = gethostbyname($hostname);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://$ip/path");
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_exec($ch);
// does NOT work
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://$hostname/path");
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
curl_exec($ch);
이것은 나를 헤매게한다. PHP curl이 DNS 확인을 처리하는 방법을 이해하지 못합니다 gethostbyname
. 또한 개인 네트워크에서 DNS 조회가 처음에 어떻게 작동하는지 정확히 이해하지 못합니다. 그래서 나는 개인 호스트를 해결하기 위해 PHP curl을 어디에서 찾아야할지 모르겠습니다.
명령 줄 curl
에서 호스트를 확인했습니다. 브라우저가 호스트를 확인했습니다. PHP curl만이이를 해결하지 못했습니다.
궁극적으로 문제는 컬 구성에 있습니다. homebrew와 함께 PHP를 설치하고 PHP에서 curl-openssl
사용 하도록 설치 했습니다. 이 curl 설치는 c-ares
도메인 이름 확인 에 사용 하기 위해 brew 공식에 의해 구성됩니다 . 어떻게 c-ares
작동하는지 모르겠지만이 VPN DNS는 OS X에서 제대로 처리되지 않는 경우가 분명합니다 (아마도 OS X /etc/resolv.conf
가 최신 상태를 유지하는 형편없는 작업을 수행했기 때문일 것입니다 ).
/usr/bin/curl
반면에 네이티브 OS X 리졸버를 사용하도록 구성되었습니다. 이것은 PHP gethostbyname
와 웹 브라우저에서 사용하는 것과 동일한 리졸버 이며, 두 가지 모두 예상대로 작동하는 이유를 설명합니다.
$ brew uninstall --ignore-dependencies curl-openssl
이 "깨진"컬 설치를 덤프하여 내 문제를 해결했습니다. 나는 PHP가 지금 사용하지 않도록하는 방법을 대체 메커니즘의 작동하지만 내가 믿는 나는 /usr/bin/curl
내가의 다른 설치가 없기 때문에 curl
(I 대해 알고)와 curl
에 나열된 버전 phpinfo()
지금이 일치 /usr/bin/curl
가되지 않았다 전에 때.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다