PHP file_get_contents () 및 요청 헤더 설정


121

PHP로 HTTP 헤더를 보낼 수 file_get_contents()있습니까?

php.ini파일 에서 사용자 에이전트를 보낼 수 있다는 것을 알고 있습니다 . 그러나, 당신은 또한 같은 다른 정보를 보낼 수 있습니다 HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGEHTTP_CONNECTIONfile_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);

당신은 당신이 원하는 것을 성취하기 위해이 패턴을 따를 수있을 것입니다. 저는 개인적으로 이것을 테스트하지는 않았습니다. (작동하지 않으면 다른 답변을 확인하십시오)



18
이 페이지에서이 유일한 유용한 답변
고든

9
더 많은 사람들이 cURL 페이지를 가리키는 대신이 질문에 대한 실제 답변을 제공하기를 바랍니다. 감사.
Merijn 2012

3
갑자기 궁금해 : 기본 사용자 에이전트는 file_get_contents()무엇입니까? 하나를 지정합니까?
Raptor

5
@Raptor ini_set('user_agent', 'SomeBrowser v42.0.4711');로 이동 user-agent.me 거기에서 당신을 복사 ... 또는 편집 php.ini 파일은 전 세계적으로이를 변경
jaggedsoft

88

다음은 나를 위해 일한 것입니다 (Dominic은 한 줄 짧았습니다).

$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 2013 년

1
@Vince 특정 상황에서 두 가지 방식으로 작동 할 수 있다고 생각합니다. 에이전트 헤더를 문자열로 설정하면 제 경우에 효과가있었습니다 (WAF는 요청을 전달하기 위해 비어 있지 않은 사용자 에이전트가 필요했습니다)
dhaupin

3
@Vince PHP 문서 는 둘 다 사용할 수 있으며 "User-Agent" headeruser_agent둘 다 지정되면 배열 요소를 재정의 합니다.
MrWhite

참고 : \ n 또는 \ r과 같은 특수 문자가 포함 된 문자열에는 작은 따옴표를 사용하지 마십시오. PHP는 올바르게 해석하지 않으며 헤더를 보내는 경우 헤더가 올바르게 전송되지 않습니다.
ak93

1
@Fanky는 "YourTool / 1.0.0"이 될 수 있습니다. 새 버전을 릴리스 할 때 사용자 에이전트 버전 인 "YourTool / 1.3.5"도 범프 할 수 있습니다.
Dereckson

39

이 변수를 사용하여 응답 헤더를 검색 할 수 있습니다. 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
이것은 질문에 전혀 대답하지 않습니다.
고든

32
아닐 수도 있지만 제목에 함축 된 반대 질문에 대한 답변입니다. 즉, file_get_contents에서 응답 헤더를 읽는 방법입니다. 그리고이 질문을 조사 할 때 Google이 착륙하는 곳입니다.
Rich Remer


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

5
당신이 보여주는 스 니펫은 쉽게 file_get_contents얻을 수 있으며 cURL로만 얻을 수있는 사용 사례를 아직 발견하지 못했습니다.
Gordon

-1

HTTPS가 필요하지 않고 시스템에서 curl을 사용할 수없는 경우 사용할 수 있습니다. fsockopen

이 함수는 일반 파일 핸들로하는 것처럼 읽고 쓸 수있는 연결을 엽니 다.


2
예,하지만 OP가 HTTP 프로토콜을 직접 구현해야한다는 의미이기도합니다. 또한 OP는 대안에 대해 묻지 않았 file_get_contents으므로 이것은 다소 주제에서 벗어난 답변입니다.
고든

-3

불행히도 file_get_contents()실제로 그 정도의 제어 기능을 제공 하지 않는 것 같습니다 . 일반적으로 cURL 확장이 가장 먼저 나오지만 , 매우 간단하고 간단한 HTTP 요청 에는 PECL_HTTP 확장 ( http://pecl.php.net/package/pecl_http )을 적극 권장 합니다. (cURL보다 작업하기가 훨씬 쉽습니다)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.