PHP file_get_contents () ve istek başlıklarını ayarlama


121

PHP ile HTTP başlıklarını göndermek mümkün müdür file_get_contents()?

Kullanıcı aracısını php.inidosyanızdan gönderebileceğinizi biliyorum . Ancak, aynı zamanda gibi diğer bilgi gönderebilir HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGEve HTTP_CONNECTIONbirlikte file_get_contents()?

Yoksa bunu gerçekleştirecek başka bir işlev var mı?

Yanıtlar:


319

Aslında, file_get_contents()işlev hakkında daha fazla okuduktan sonra :

// 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);

Aradığınızı başarmak için bu modeli takip edebilirsiniz, ancak bunu kişisel olarak test etmedim. (ve işe yaramazsa, diğer cevabıma göz atmaktan çekinmeyin)



18
bu, bu sayfadaki tek yararlı cevap
Gordon

9
Keşke burada daha fazla insan sadece cURL sayfasına işaret etmek yerine bu soruya gerçek cevabı verse. Teşekkürler.
Merijn

3
aniden merak ediyorum: varsayılan kullanıcı aracısı file_get_contents()nedir? birini belirliyor mu?
Raptor

5
@Raptor user-agent.me ini_set('user_agent', 'SomeBrowser v42.0.4711');adresine gidin ve oradan sizinkini kopyalayın .. veya php.ini'yi global olarak değiştirmek için düzenleyin
jaggedsoft

88

İşte benim için işe yarayan şey (Dominic sadece bir satır kısaydı).

$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);

6
Bir tarayıcının kullanıcı aracısını taklit etmemelisiniz. Bunun yerine, aracınız için bir Kullanıcı-Aracı dizesi oluşturun. www-archive.mozilla.org/build/revised-user-agent-strings.html format hakkında biraz fikir verebilir.
Dereckson

1
@ Vince, belirli durumlarda her iki şekilde de çalışabileceğini düşünüyorum. Ajan başlığını böyle bir dize olarak ayarlamak benim durumumda çalıştı (WAF, geçiş isteği için boş olmayan bir kullanıcı aracısına ihtiyaç duyuyordu)
dhaupin

3
@Vince PHP dokümanları , her ikisinin de kullanılabileceğini ve "Kullanıcı-Aracısı" headernın user_agent, her ikisi de belirtilmişse dizi elemanını geçersiz kılacağını belirtir.
MrWhite

NOT: \ n veya \ r gibi özel karakterler içeren dizelerde asla tek tırnak kullanmayın. PHP bunları doğru şekilde yorumlamaz ve başlıkların gönderilmesi durumunda başlıklarınız doğru şekilde gönderilmez.
ak93

1
@Fanky en basit olanı "YourTool / 1.0.0" olabilir. Yeni bir sürüm yayınladığınızda, "YourTool / 1.3.5" kullanıcı aracısı sürümünü de çarpabilirsiniz.
Dereckson

38

Bu değişkeni, file_get_contents()işlevden sonra yanıt başlıklarını almak için kullanabilirsiniz .

Kod:

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

Çıktı:

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"
}

6
bu soruya hiç cevap vermiyor.
Gordon

32
Belki hayır, ancak başlıkta ima edilen zıt soruyu yanıtlar; bu, yanıt başlıklarının file_get_contents dosyasından nasıl okunacağıdır. İşte Google'ın BU soruyu araştırırken geldiği yer burasıdır.
Rich Remer


-1

Bu kitaplık basit olandan daha fazla özelliğe sahip olduğundan php cURL kitaplıklarını kullanmak muhtemelen doğru yol olacaktır file_get_contents(...).

Bir örnek:

<?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);
?>

5
Gösterdiğiniz pasajı da elde etmek kolaydır file_get_contentsve henüz yalnızca cURL ile elde edebileceğiniz bir Kullanım Örneği ile karşılaşmadım.
Gordon

-2

HTTPS'ye ihtiyacınız yoksa ve curl sisteminizde mevcut değilse, kullanabilirsiniz fsockopen

Bu işlev, normal bir dosya tanıtıcısıyla yaptığınız gibi hem okuyup hem de yazabileceğiniz bir bağlantı açar.


2
evet, ancak bu OP'nin HTTP protokolünü elle uygulaması gerektiği anlamına da gelir. Ayrıca, OP alternatifler hakkında soru sormadı, file_get_contentsbu yüzden bu biraz konu dışı bir cevap.
Gordon

-4

Ne yazık ki, file_get_contents()gerçekten bu derece kontrol sunacak gibi görünmüyor . CURL uzantısı genellikle ilk ortaya çıkan eklentidir, ancak çok basit ve anlaşılır HTTP istekleri için PECL_HTTP uzantısını ( http://pecl.php.net/package/pecl_http ) şiddetle tavsiye ederim . (ile çalışmak cURL'den çok daha kolaydır)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.