[英]PHP cURL: could not resolve host (over VPN)
我遠程工作,可以通過 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)
正確解析了主機。 我曾嘗試強制使用 IPv4,因為我讀過 IPv6 會導致此類失敗但沒有成功。
// 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 無法解決它。
最終,問題歸結為 curl 配置。 我使用自制軟件安裝了 PHP,並作為依賴項安裝了curl-openssl
以供 PHP 使用。 此 curl 安裝由 brew 公式配置為使用c-ares
進行域名解析。 我不知道c-ares
是如何工作的,但是這個 VPN DNS 顯然是一個邊緣情況,它在 OS X 上無法正確處理(可能是因為 OS X 在保持/etc/resolv.conf
最新方面做得很糟糕) .
另一方面, /usr/bin/curl
被配置為使用本機 OS X 解析器。 這與 PHP 的gethostbyname
和 Web 瀏覽器使用的解析器相同,這解釋了為什么它們都按預期工作。
$ brew uninstall --ignore-dependencies curl-openssl
這通過轉儲這個“損壞的”curl 安裝解決了我的問題。 我不確定回退機制是如何工作的,但我相信 PHP 現在正在使用/usr/bin/curl
因為我沒有其他curl
安裝(我知道)並且phpinfo()
列出的curl
版本現在匹配/usr/bin/curl
之前它沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.