2010-01-21 180 views
81

使用PHP,是否可以發送帶有file_get_contents()的HTTP標頭?PHP file_get_contents()和設置請求標頭

我知道你可以從你的php.ini文件發送用戶代理。但是,您是否也可以將HTTP_ACCEPT,HTTP_ACCEPT_LANGUAGEHTTP_CONNECTION等其他信息與file_get_contents()一起發送?

或者還有其他功能可以實現這個功能嗎?

回答

228

事實上,在上file_get_contents()功能進一步閱讀:

// Create a stream 
$opts = [ 
    "http" => [ 
     "method" => "GET", 
     "header" => "Accept-language: en\r\n" . 
      "Cookie: foo=bar\r\n" 
    ] 
]; 

$context = stream_context_create($opts); 

// Open the file using the HTTP headers set above 
$file = file_get_contents('http://www.example.com/', false, $context); 

您可以按照這個模式來實現你追求什麼,我的天堂」不過親自測試了一下。 (如果它不工作,隨時檢查出我的其他答案)

+1

另請參閱:http://docs.php.net/context和http://docs.php.net/stream_context_create – VolkerK

+15

這是本頁唯一有用的答案 – Gordon

+9

我希望更多的人在這裏給出這個問題的實際答案而不是隻指向cURL頁面。謝謝。 – Merijn

-2

不幸的是,它看起來不像file_get_contents()真的提供了這種程度的控制。 cURL擴展通常是第一個出現的,但我強烈建議使用PECL_HTTP擴展(http://pecl.php.net/package/pecl_http)來實現非常簡單和直接的HTTP請求。 (與cURL一起工作要容易得多)

1

使用php cURL庫可能是正確的選擇,因爲這個庫比簡單的file_get_contents(...)更多的功能。

一個例子:

<?php 
$ch = curl_init(); 
$headers = array('HTTP_ACCEPT: Something', 'HTTP_ACCEPT_LANGUAGE: fr, en, da, nl', 'HTTP_CONNECTION: Something'); 

curl_setopt($ch, CURLOPT_URL, "http://localhost"); # URL to post to 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); # return into a variable 
curl_setopt($ch, CURLOPT_HTTPHEADER, $header); # custom headers, see above 
$result = curl_exec($ch); # run! 
curl_close($ch); 
?> 
+4

您展示的代碼片段很容易用'file_get_contents'來實現,而且我還沒有遇到一個只能用cURL實現的用例。 – Gordon

0

如果你不需要HTTPS和捲曲無法使用你的系統,你可以使用fsockopen

此功能打開一個連接從中您可以讀寫,就像使用普通文件句柄一樣。

+1

這樣的頁面,但這也意味着OP必須手動實現HTTP協議。另外,OP沒有詢問'file_get_contents'的替代方法,所以這是一個脫離主題的答案。 – Gordon

34

您可以使用此變量在file_get_contents()函數後檢索響應標頭。

代碼:

file_get_contents("http://example.com"); 
    var_dump($http_response_header); 

輸出:

array(9) { 
    [0]=> 
    string(15) "HTTP/1.1 200 OK" 
    [1]=> 
    string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT" 
    [2]=> 
    string(29) "Server: Apache/2.2.3 (CentOS)" 
    [3]=> 
    string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT" 
    [4]=> 
    string(27) "ETag: "280100-1b6-80bfd280"" 
    [5]=> 
    string(20) "Accept-Ranges: bytes" 
    [6]=> 
    string(19) "Content-Length: 438" 
    [7]=> 
    string(17) "Connection: close" 
    [8]=> 
    string(38) "Content-Type: text/html; charset=UTF-8" 
} 
+3

這根本不回答問題。 – Gordon

+24

也許不是,但它回答了標題中隱含的相反問題,即如何從file_get_contents讀取響應頭。這是谷歌在調查這個問題時所在的地方。 –

74

這裏是我工作(多米尼克只是一個線路短路)。

$url = ""; 

$options = array(
    'http'=>array(
    'method'=>"GET", 
    'header'=>"Accept-language: en\r\n" . 
       "Cookie: foo=bar\r\n" . // check function.stream-context-create on php.net 
       "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad 
) 
); 

$context = stream_context_create($options); 
$file = file_get_contents($url, false, $context); 
+5

您不應該冒充瀏覽器的用戶代理。相反,請爲您的工具創建一個User-Agent字符串。 http://www-archive.mozilla.org/build/revised-user-agent-strings.html可以給出一些有關格式的想法。 – Dereckson

+3

你是錯的人,你不能以這種方式更改用戶代理(使用標題)。這是怎麼做到的:array('http'=>'user_agent'=> $ _SERVER ['HTTP_USER_AGENT']) – Vince

+0

+1解決我的問題=) – Dave