【问题标题】:server not sending custom header values服务器未发送自定义标头值
【发布时间】:2012-07-07 03:12:10
【问题描述】:

我正在使用 PHP 5.2.17 获取远程页面,HTTP 请求包含一些 cookie 值但 cookie 未传递到目标页面。

$url = 'http://somesite.com/';
$opts = array(
    'http' => array
        (
        'header' => array("Cookie: field1=value1; field2=value2\r\n")
    )
);
$context = stream_context_create($opts);
echo file_get_contents($url, false, $context);

你能帮我找出问题吗? 注意:我不能使用 curl。 谢谢。

【问题讨论】:

  • 我认为可能是因为某些 PHP 或 Apache 设置,但我不知道在哪里...
  • 检查allow_url_fopen 就像我说的那样。如果禁用,您可以使用套接字 i/o 完成任务。查看 here 的示例,在页面中搜索“基于 fsockopen 的 HTTP 请求”。
  • ini_get('allow_url_fopen') 的结果是“1”。

标签: php http-headers


【解决方案1】:

您确定接收代码工作正常吗?

我可以让您的示例与接收页面一起简单地回显:

<?php
echo $_COOKIE['field1'] . '::' . $_COOKIE['field2']; // returns value1::value2
?>

或者,该网站可能需要用户代理(任何东西)。我在访问 Wikipedia 之前遇到了这个问题(不受所有 Mediawiki 软件的限制;显然仅适用于 Wikimedia 网站)。将“http”数组中的 user_agent 属性设置为您想要的任何值。 (但是,如果您碰巧尝试访问 Wikipedia,则可以尝试使用他们的 api.php:http://en.wikipedia.org/w/api.php;如果是另一个 Mediawiki 站点,请使用相同的相对路径)

【讨论】:

  • 接收代码是正确的,我也使用了一些标题检查工具,如ericgiguere.com/tools/http-header-viewer.html,但没有成功。
  • 那么接收端就是你的站点和软件,那么缺少的用户代理就不是问题了吗?
  • 我可以设置用户代理 ini_set('user_agent',"test agent");。设置用户代理没有问题。
【解决方案2】:

可能allow_url_fopen 未启用,请检查带有 ini_get 的值:ini_get('allow_url_fopen')

您还可以通过调用 file_get_contents() 在您知道可公开访问的任何旧页面上进行完整性检查。

除此之外,您的示例代码看起来还不错。

第二个选项,套接字连接:

<?php
$fp = fsockopen("somesite.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: somesite.com\r\n";
    $out .= "Cookie: field1=value1; field2=value2; path=/; domain=somesite.com;\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
echo PHP_EOL;

【讨论】:

  • 我用过 phpinfo();它说本地价值和主价值是“开”。
  • 不是从 cli 运行脚本吗?
  • 对不起,什么是cli? PHP 脚本在服务器上运行,它在本地主机上运行良好,但是当我将它上传到服务器上时,cookie 没有发送。
  • 您确定可以服务器发出 HTTP 请求吗?这很不寻常,但有时服务器会被锁定,从而限制发出的请求。
  • 是的!上面的脚本回显页面内容。
【解决方案3】:
$url = 'http://somesite.com/';
$opts = array(
    'http' => array
    (
        'header' => "Cookie: field1=value1; field2=value2\r\n"
    )
);
$context = stream_context_create($opts);
file_get_contents($url, false, $context);

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2016-08-03
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2018-05-15
    • 1970-01-01
    相关资源
    最近更新 更多