He visto por ahí que todavía hay gente que no tiene claro cómo bajar archivos de Internet con PHP con cabeceras personalizadas y/o obtener las cabeceras de respuesta.

En versiones antiguas de PHP se solían usar las funciones fsockopen o la librería curl para hacer peticiones HTTP personalizadas. Sin embargo a partir de PHP4.3 y PHP5 empiezan a haber facilidades al respecto.

http_build_query + file_get_contents + stream_context_create + $http_response_header

**Para construir una query-string para usar en GET o en POST mediante un array asociativo:
**

// $str = 'a=1&b=test+2';  
$str = http_build_query(array(  
    'a' => 1,  
    'b' => 'test 2',  
));  

**Para hacer una petición POST a un formulario www-encodeado con un referer, cookies, simulando ser google chrome y obtener las cabeceras de respuesta:
**

unset($http_response_header);  

$http_response_body = file_get_contents('http://url/to/form', false, stream_context_create(array(  
    'http' => array(  
        'method' => "POST",  
        'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.10 (KHTML, like Gecko) Chrome/8.0.552.215 Safari/534.10',  
        'header' => implode("\r\n", array(  
            "Accept-language: en",  
            "Content-Type: application/x-www-form-urlencoded",  
            "Referer: http://url/to/form",  
            "Cookie: foo=bar",  
            "Connection: close",  
        )),  
        'content' => http_build_query(array(  
            'form_key'         => 'form_value',  
            'another_form_key' => '10',  
        )),  
    )  
)));  

if (!isset($http_response_header)) throw(new Exception("Can't connect"));  
print_r($http_response_header);  
echo $http_response_body;