如何使用file_get_contents发送 Cookie

2022-08-30 22:48:05

我正在尝试从另一个文件中获取内容(不要问为什么)。
我有两个文件:test1.phptest2.phptest1.php返回一个字符串,该字符串基于登录的用户。file_get_contents

test2.php尝试获取 test1 的内容.php并由浏览器执行,从而获取 cookie。

为了发送带有 的 cookie,我创建了一个流上下文:file_get_contents

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"))`;

我正在检索以下内容:

$contents = file_get_contents("http://www.example.com/test1.php", false, $opts);

但现在我得到错误:

警告:file_get_contents(http://www.example.com/test1.php) [function.file-get-content]: 无法打开流: HTTP 请求失败!HTTP/1.1 404 未找到

有人知道我在这里做错了什么吗?

编辑:
忘了提:没有streaming_context,页面只是加载。但是没有饼干,我无法获得我需要的信息。


答案 1

首先,这可能只是您问题中的拼写错误,但是file_get_contents()的第三个参数需要是您的流上下文,而不是选项数组。我用这样的东西进行了快速测试,一切都按预期工作

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));
$context = stream_context_create($opts);
$contents = file_get_contents('http://example.com/test1.txt', false, $context);
echo $contents;

该错误指示服务器返回 404。尝试从运行 PHP 的计算机获取 URL,而不是从工作站/台式机/笔记本电脑获取 URL。可能是您的 Web 服务器在访问站点时遇到问题,您的本地计算机具有缓存的副本,或者其他一些网络问题。

请确保在运行此测试时重复您的确切请求,包括您要发送的cookie(命令行 curl 对此有好处)。有问题的页面完全有可能在没有cookie的浏览器中加载良好,但是当您发送cookie时,网站实际上返回了404。

确保 $_SERVER['HTTP_COOKIE'] 具有您认为的原始 cookie。

如果您正在抓取屏幕,请下载Firefox和LiveHTTPHeaders扩展的副本。执行所有必要的步骤以访问Firefox中所需的任何页面。然后,使用 LiveHTTPHeaders 的输出,重新创建完全相同的请求重新序列。包括每个标头,而不仅仅是 Cookie。

最后,PHP Curl的存在是有原因的。如果可能的话,(我不是在问!)使用它。:)


答案 2

只是为了分享这些信息。使用 时,会话文件被 PHP 锁定。因此,实际脚本是唯一可以访问会话文件的脚本。如果您尝试通过或可以等待很长时间,因为您尝试打开已锁定的文件。session_start()fsockopen()file_get_contents()

解决此问题的一种方法是使用 来解锁文件,然后在 使用 后重新锁定它。session_write_close()session_start()

例:

<?php
 $opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"));
 $context = stream_context_create($opts);
 session_write_close(); // unlock the file
 $contents = file_get_contents('http://120.0.0.1/controler.php?c=test_session', false, $context);
 session_start(); // Lock the file
 echo $contents;
?>

由于 是 阻止 函数, 因此在尝试修改会话文件时,两个脚本都不会并发。file_get_contents()

但我确信这不是使用扩展连接操作会话的最佳方式。

顺便说一句:它比cURL更快,并且fsockopen()

如果您发现更好的东西,请告诉我。


推荐