PHP file_get_contents () และการตั้งค่าส่วนหัวของคำขอ


121

ด้วย PHP เป็นไปได้ไหมที่จะส่งส่วนหัว HTTP ด้วยfile_get_contents()?

ฉันรู้ว่าคุณสามารถส่งตัวแทนผู้ใช้จากphp.iniไฟล์ของคุณได้ แต่คุณสามารถส่งข้อมูลอื่น ๆ เช่นHTTP_ACCEPT, HTTP_ACCEPT_LANGUAGEและHTTP_CONNECTIONด้วยfile_get_contents()?

หรือมีฟังก์ชั่นอื่นที่จะทำให้สิ่งนี้สำเร็จหรือไม่?

คำตอบ:


319

อันที่จริงเมื่ออ่านเพิ่มเติมเกี่ยวกับ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
ดูสิ่งนี้ด้วย: docs.php.net/context และdocs.php.net/stream_context_create
VolkerK

18
นี่เป็นคำตอบเดียวที่มีประโยชน์ในหน้านี้
Gordon

9
ฉันหวังว่าจะมีคนให้คำตอบที่แท้จริงสำหรับคำถามนี้แทนที่จะชี้ไปที่หน้า cURL ขอบคุณ
Merijn

3
อยากรู้อยากเห็นทันใด: ตัวแทนผู้ใช้เริ่มต้นของfile_get_contents()อะไร? มันระบุอย่างใดอย่างหนึ่ง?
Raptor

5
@Raptor ini_set('user_agent', 'SomeBrowser v42.0.4711');ไปที่user-agent.meและคัดลอกของคุณจากที่นั่น .. หรือแก้ไข php.ini เพื่อเปลี่ยนแปลงทั่วโลก
jaggedsoft

88

นี่คือสิ่งที่ได้ผลสำหรับฉัน (โดมินิกสั้นเพียงหนึ่งบรรทัด)

$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
คุณไม่ควรแอบอ้างเป็นตัวแทนผู้ใช้ของเบราว์เซอร์ ให้สร้างสตริง User-Agent สำหรับเครื่องมือของคุณแทน www-archive.mozilla.org/build/revised-user-agent-strings.htmlอาจให้แนวคิดบางอย่างเกี่ยวกับรูปแบบ
Dereckson

1
@Vince ฉันคิดว่ามันอาจใช้ได้ทั้งสองวิธีในบางสถานการณ์ การตั้งค่าส่วนหัวของตัวแทนเช่นนั้นเป็นสตริงทำงานในกรณีของฉัน (WAF จำเป็นตัวแทนของผู้ใช้ที่ไม่ว่างสำหรับการร้องขอที่จะผ่าน)
dhaupin

3
@Vince เอกสาร PHP ระบุว่าสามารถใช้ได้ทั้งสองอย่างและ "User-Agent" headerจะแทนที่user_agentองค์ประกอบอาร์เรย์หากระบุทั้งสองอย่าง
MrWhite

หมายเหตุ: ห้ามใช้เครื่องหมายคำพูดเดี่ยวกับสตริงที่มีอักขระพิเศษเช่น \ n หรือ \ r PHP จะตีความไม่ถูกต้องและในกรณีที่ส่งส่วนหัวส่วนหัวของคุณจะส่งไม่ถูกต้อง
ak93

1
@Fanky ง่ายที่สุดอาจเป็น "YourTool / 1.0.0" เมื่อคุณออกเวอร์ชันใหม่คุณสามารถบั๊มเวอร์ชัน User-agent ได้เช่นกัน "YourTool / 1.3.5"
Dereckson

38

คุณสามารถใช้ตัวแปรนี้เพื่อดึงข้อมูลส่วนหัวของการตอบกลับหลัง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"
}

6
สิ่งนี้ไม่ตอบคำถามเลย
Gordon

32
อาจจะไม่ใช่ แต่จะตอบคำถามตรงข้ามโดยนัยในชื่อเรื่องซึ่งเป็นวิธีอ่านส่วนหัวการตอบกลับจาก file_get_contents และนี่คือที่มาของ Google เมื่อตรวจสอบคำถามนั้น
Rich Remer

0

ใช่.

เมื่อเรียกfile_get_contentsใช้ URL ควรใช้stream_create_contextฟังก์ชันซึ่งได้รับการบันทึกไว้ค่อนข้างดีใน php.net

ซึ่งจะกล่าวถึงในหน้าต่อไปนี้ที่ php.net ในส่วนความคิดเห็นของผู้ใช้: http://php.net/manual/en/function.stream-context-create.php


-1

การใช้ห้องสมุด PHP 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);
?>

5
ตัวอย่างข้อมูลที่คุณแสดงนั้นทำได้ง่ายfile_get_contentsเช่นกันและฉันยังไม่เจอ Use Case ซึ่งคุณสามารถทำได้ด้วย cURL เท่านั้น
Gordon

-2

หากคุณไม่ต้องการ HTTPS และไม่มี curl ในระบบของคุณคุณสามารถใช้ได้ fsockopen

ฟังก์ชั่นนี้จะเปิดการเชื่อมต่อซึ่งคุณสามารถอ่านและเขียนได้เหมือนกับที่คุณทำกับตัวจัดการไฟล์ปกติ


2
ใช่ แต่ก็หมายความว่า OP ต้องใช้โปรโตคอล HTTP ด้วยตนเอง นอกจากนี้ OP ไม่ได้ถามเกี่ยวกับทางเลือกอื่นfile_get_contentsดังนั้นนี่จึงเป็นคำตอบที่ไม่ตรงประเด็น
Gordon

-4

น่าเสียดายที่ดูเหมือนว่าจะไม่มีfile_get_contents()การควบคุมในระดับนั้นจริงๆ ส่วนขยาย cURL มักจะเป็นส่วนขยายแรกที่เกิดขึ้น แต่ฉันขอแนะนำเป็นอย่างยิ่งส่วนขยาย PECL_HTTP ( http://pecl.php.net/package/pecl_http ) สำหรับคำขอ HTTP ที่ง่ายและตรงไปตรงมา (ใช้งานได้ง่ายกว่า cURL มาก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.