簡體   English   中英

PHP cURL:無法解析主機(通過 VPN)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM