Php 如何发送包含文件\u获取\u内容的Cookie

Php 如何发送包含文件\u获取\u内容的Cookie,php,session,cookies,file-get-contents,Php,Session,Cookies,File Get Contents,我正在尝试从另一个文件中获取内容,该文件包含file\u get\u contents(不要问为什么)。 我有两个文件:test1.php和test2.php。php根据登录的用户返回一个字符串 test2.php尝试获取test1.php的内容,并由浏览器执行,从而获取cookie 要发送包含文件\u get\u内容的cookie,我创建了一个流式上下文: $opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER[

我正在尝试从另一个文件中获取内容,该文件包含
file\u get\u contents
(不要问为什么)。
我有两个文件:test1.php和test2.php。php根据登录的用户返回一个字符串

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

要发送包含
文件\u get\u内容的cookie,我创建了一个流式上下文:

$opts = array('http' => array('header'=> 'Cookie: ' . $_SERVER['HTTP_COOKIE']."\r\n"))`;
我正在使用以下内容检索内容:

$contents = file_get_contents("http://www.example.com/test1.php", false, $opts);
但现在我得到了一个错误:

警告:文件获取内容()[函数.文件获取内容]:无法打开流:HTTP请求失败!未找到HTTP/1.1 404

有人知道我做错了什么吗

编辑:

忘了提及:如果没有流式处理上下文,页面只是加载。但是如果没有cookies,我就无法获得所需的信息。

请确保服务器上存在file1.php。尝试在您自己的浏览器中打开它以确保

首先,这可能只是您的问题中的一个输入错误,但是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,并从工作站/台式机/笔记本电脑上获取而不是。这可能是因为您的web服务器无法访问站点,您的本地计算机有缓存副本,或者其他一些网络问题

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

确保$\u服务器['HTTP\u COOKIE']具有您认为的原始COOKIE

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


最后,存在是有原因的。如果可能的话,(我不是问!)用它来代替

出于好奇,您是否试图在一个有空格的页面上获取内容?我记得我曾尝试在名称中有空格的URL上使用fgc,而我的web浏览器对其进行了很好的解析,但fgc没有。最后,我不得不使用
str\u replace
将“”替换为“%20”


我认为这应该是相对容易发现的,尽管它只报告了文件名的一半。另外,我注意到在其中一篇文章中,有人在定义标题时使用了\r\n。请记住,PHP不希望这些文件用单引号引起来,但它们用双引号引起来效果很好。

只是为了分享这些信息。 使用
session\u start()
时,会话文件被PHP锁定。因此,实际脚本是唯一可以访问会话文件的脚本。如果您试图通过
fsockopen()
文件获取内容()
访问它,您可能会在尝试打开已锁定的文件后等待很长时间

解决此问题的一种方法是使用
session\u write\u close()

例如:

<?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\u get\u contents()
是一个阻塞函数,因此在尝试修改会话文件时,两个脚本不会同时运行

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

顺便说一句:它比cURL和fsockopen()更快


如果你发现更好的,请告诉我。

非常感谢你发布此帖子:)我希望我能多投些票,因为你刚刚救了我,让我免于拔出所有的头发。谢谢,我很高兴与大家分享;)仅供参考-如果您使用的是A2hosting,您必须请求授予fopen访问权限(出于安全原因,他们默认会关闭fopen),但使用此代码时,我会收到一个错误“HTML标头失败”,因此我需要通过在文件获取内容之前添加“session_write_close();”来获得解决方案。这是正确的方式吗?