[英]PHP CURL(7.48.0) DNS resolve in /etc/hosts
我遇到了一個關於php curl的奇怪問題。
它將連接到DNS服務器以解析,即使主機位於/ etc / hosts中!
軟件版本:
Server : CentOS release 6.3 (Final)
Linux Curl version : curl --version curl 7.47.1 (x86_64-pc-linux-gnu) libcurl/7.47.1 OpenSSL/1.0.1e zlib/1.2.3 libidn/1.18 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz UnixSockets`
PHP version : php -v PHP 5.4.41 (cli) (built: Aug 11 2015 22:29:40) Copyright (c) 1997-2014 The PHP Group Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
PHP curl version : php -r "var_export(curl_version());" array ( 'version_number' => 471040, 'age' => 3, 'features' => 952221, 'ssl_version_number' => 0, 'version' => '7.48.0', 'host' => 'x86_64-redhat-linux-gnu', 'ssl_version' => 'OpenSSL/1.0.1e', 'libz_version' => '1.2.3',
服務器配置:
/etc/hosts : 127.0.0.1 lalala.examplekkk.com
/etc/resolv.conf : nameserver 8.8.8.8
/etc/nsswitch.conf hosts: files dns
命令執行結果:
PING lalala.examplekkk.com (127.0.0.1) 56(84) bytes of data. 64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.041 ms 64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.035 ms ....
strace php -r '$curl=curl_init();$url="http://lalala.examplekkk.com";curl_setopt($curl,CURLOPT_URL,$url);$content=curl_exec($curl);echo $content;' ... open("/etc/hosts", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=1308, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f85c7b5c000 read(3, "127.0.0.1 localhost localhost."..., 4096) = 1308 ... fcntl(3, F_SETFD, FD_CLOEXEC) = 0 connect(3, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("8.8.8.8")}, 16) = 0 sendto(3, "\177{\1\0\0\1\0\0\0\0\0\0\6lalala\nexamplekkk\3c"..., 39, MSG_NOSIGNAL, NULL, 0) = 39 poll([{fd=3, events=POLLIN|POLLRDNORM}], 1, 0) = 0 (Timeout) ...
我很困惑,為什么PHP curl需要連接到DNS服務器來解析主機名?
我執行命令'strace curl'http://lalala.examplekkk.com',沒有連接到8.8.8.8就可以了。
這是php-curl中的錯誤嗎?
摘要: CURLOPT_RESOLVE
是您的問題的解決方案。
來自https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html :
為IP地址解析提供自定義主機名。
在PHP實現的情況下,您必須提供至少包含一個元素的數組。 cURL只查看數組值,而不是鍵。
每個單一名稱解析字符串應使用HOST格式編寫:PORT:ADDRESS [,ADDRESS] ...其中HOST是libcurl將嘗試解析的名稱,PORT是libcurl想要連接到HOST的服務的端口號和ADDRESS是一個或多個數字IP地址。
以下是使用您的值的更完整示例:
$curl = curl_init();
$options = [
CURLOPT_RESOLVE => ['lalala.examplekkk.com:80:127.0.0.1'],
CURLOPT_URL => "http://lalala.examplekkk.com/",
CURLOPT_RETURNTRANSFER => 1,
];
curl_setopt_array($curl, $options);
$content = curl_exec($curl);
這不是一個錯誤,它是記錄良好的行為。
據我所知,您不能告訴cURL使用/etc/hosts
文件。 如果這不正確,請發表評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.