2012-02-14 2 views
9

У меня возникли проблемы с тем, чтобы библиотека PHP cURL распознала псевдоним, который я создал в моем файле /etc/hosts.PHP cURL не видит файл/etc/hosts

Это то, что у меня в /etc/hosts файл прямо сейчас:

192.168.0.20 www.example.dev 

С другой стороны (192.168.0.20) Apache настроен на запуск виртуального хоста в домене example.dev. Псевдоним работает, если я тестирую его в своем браузере, но с PHP cURL просто не работает.

hosts файл находится на обеих машинах (192.168.0.10 < = PHP кли, 192.168.0.20 < = Apache).

Для полноты это код PHP, который я использую.

 $this->url = 'http://www.example.dev/'; 
     $this->ch = curl_init(); 
     $header = array 
     (
      "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
      "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3", 
      "Accept-Encoding: gzip,deflate,sdch", 
      "Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4", 
      "Cache-Control: max-age=0", 
      "Connection: keep-alive", 
     ); 

     $sUserAgent = $this->tor ? UserAgents::getRandom() : UserAgents::CHROME16_LINUX; 

     curl_setopt($this->ch, CURLOPT_HTTPHEADER, $header); 
     curl_setopt($this->ch, CURLOPT_USERAGENT, $sUserAgent); 
     curl_setopt($this->ch, CURLOPT_URL, $this->url); 
     curl_setopt($this->ch, CURLOPT_HEADER, false); 
     curl_setopt($this->ch, CURLINFO_HEADER_OUT, true); 
     curl_setopt($this->ch, CURLOPT_FOLLOWLOCATION, true); 
     curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, (bool) $waitResponse); 
     curl_setopt($this->ch, CURLOPT_VERBOSE, (bool) $this->verbose); 
     curl_setopt($this->ch, CURLOPT_PORT, $this->port); 
     curl_setopt($this->ch, CURLOPT_AUTOREFERER, true); 
     curl_setopt($this->ch, CURLOPT_MAXREDIRS, 10); 
     curl_setopt($this->ch, CURLOPT_ENCODING, ''); 
     curl_setopt($this->ch, CURLOPT_CONNECTTIMEOUT, 30); 
     curl_setopt($this->ch, CURLOPT_TIMEOUT, 60); 
     curl_setopt($this->ch, CURLOPT_DNS_CACHE_TIMEOUT, 120); 
     curl_setopt($this->ch, CURLOPT_COOKIESESSION, true); 
     curl_setopt($this->ch, CURLOPT_COOKIEFILE, 'cookie'); 

     foreach ($this->files as $k => $file) { 
      $this->data['_file_' . $k] = '@' . $file; 
     } 

     curl_setopt($this->ch, CURLOPT_POST, true); 
     curl_setopt($this->ch, CURLOPT_POSTFIELDS, $this->data); 

     $this->result = curl_exec($this->ch); 

Примечание: Этот вопрос кажется, this one, но связанные с PHP.

+0

Вы перезапустили сервер? Просто чтобы убедиться? –

+2

- файл хостов на правильной машине? вы запускаете PHP на этой машине? –

+0

Можете ли вы разместить точный код? Не должно быть проблем. – mlinuxgada

ответ

6

решаемые с помощью этого URL "http://192.168.0.20/" вместо "http://www.example.dev"

Также заголовок необходим "Host" ...

$header = array 
(
    "Host: www.example.dev", // IMPORTANT 
    "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", 
    "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3", 
    "Accept-Encoding: gzip,deflate,sdch", 
    "Accept-Language: it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4", 
    "Cache-Control: max-age=0", 
    "Connection: keep-alive", 
); 

curl_setopt($this->ch, CURLOPT_URL, 'http://192.168.0.20/'); 
curl_setopt($this->ch, CURLOPT_HTTPHEADER, $header); 
2

Возможно, вы запускаете PHP на этом сервере Apache и там нет записи файла hosts.

+0

Файл hosts находится на всех машинах (192.168.0.10 <= php cli, 192.168.0.20 <= apache) –

+0

@karoly спасибо! это просветит меня! Я использовал докер для тестов, и у контейнера не было записи в файле hosts! – mloureiro