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 cli, 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);

Примечание. Эта проблема похожа на эту но связанный с PHP.


person Francesco Casula    schedule 14.02.2012    source источник
comment
Вы перезапустили сервер? Просто чтобы убедиться?   -  person Pekka    schedule 14.02.2012
comment
Можете ли вы опубликовать точный код? Не должно быть проблем.   -  person mlinuxgada    schedule 14.02.2012
comment
файл hosts находится на правильной машине? Вы запускаете PHP на этой машине?   -  person Karoly Horvath    schedule 14.02.2012
comment
Я также не ожидаю никаких проблем, можете ли вы подключиться к нему с помощью ping или telnet? Curl настроен на использование прокси? Если да, он будет игнорировать /etc/hosts   -  person rkosegi    schedule 14.02.2012
comment
Файл hosts есть на всех машинах (192.168.0.10 ‹= php cli, 192.168.0.20 ‹= apache)   -  person Francesco Casula    schedule 14.02.2012


Ответы (2)


Решено с использованием этого 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);
person Francesco Casula    schedule 15.02.2012

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

person Karoly Horvath    schedule 14.02.2012
comment
Файл hosts есть на всех машинах (192.168.0.10 ‹= php cli, 192.168.0.20 ‹= apache) - person Francesco Casula; 14.02.2012
comment
@karoly, спасибо! это просвети меня! Я использовал докер для тестов, и у контейнера не было записи в файле hosts! - person mloureiro; 27.02.2016