如何在php中向file_get_content添加多个标头

时间:2015-01-25 08:05:54

标签: php

$opts = array( 'http'=>array( 'method'=>$_SERVER['REQUEST_METHOD'],
          'header'=>array("Accept-language: en\r\n" ,"Cookie: ".session_name()."=".session_id()."\r\n"," Content-type: application/x-www-form-urlencoded\r\n"),
   'content' => $_POST) );
$postdata = http_build_query($_POST);


$context = stream_context_create($opts);

session_write_close();   // this is the key

echo $obsah = file_get_contents("http://localhost/journal/", false, $context); 

此代码无法使用post和cookie

3 个答案:

答案 0 :(得分:12)

现有的两个答案不正确。

不需要将新行(\n)添加到stream_context_create()中使用的HTTP标头中,而且不应在HTTP附近的任何地方使用回车符(\r)。

以下代码从OP中复制并更正:

$postdata = http_build_query($_POST, '', '&', PHP_QUERY_RFC3986);
$opts = array(
    'http' => array(
        'method' => $_SERVER['REQUEST_METHOD'],
        'header' => array(
            "Accept-language: en",
            "Cookie: " . session_name() . "=" . session_id(),
            "Content-type: application/x-www-form-urlencoded",
        ),
        'content' => $postdata,
    )
);

$context = stream_context_create($opts);
$obsah = file_get_contents("http://localhost/journal/", false, $context);

echo $obsah

我还在最后一个数组项中添加了逗号,以便维护在Git / SVN提交中不会有不必要的行,并配置http_build_query()以使用更现代的RFC 3986编码。

答案 1 :(得分:0)

在使用array()而不是字符串传递标题时,您不需要\r\n,因为PHP的stream_context_create()会在报头中。

您也不需要session_write_close()

答案 2 :(得分:-1)

当你传递多个标题时,在发送POST数据之前应该有两个\r\n

让我解释一下。

试试这个:

$opts = array(
    'http' => array(
        'method' => $_SERVER['REQUEST_METHOD'],
        'header' => array(
            "Accept-language: en\r\n",
            "Cookie: ".session_name()."=".session_id()."\r\n",
            "Content-type: application/x-www-form-urlencoded\r\n\r\n"
        ),
        'content' => $_POST
    )
);

$postdata = http_build_query($_POST);

$context = stream_context_create($opts);

session_write_close();   // this is the key

echo $obsah = file_get_contents("http://localhost/journal/", false, $context);