代码之家  ›  专栏  ›  技术社区  ›  Ikke

无法发送包含文件获取内容的cookie

  •  12
  • Ikke  · 技术社区  · 16 年前

    我正在尝试从另一个文件中获取包含“获取”内容的内容(不要问为什么)。 我有两个文件:test1.php和test2.php。test1.php返回一个基于登录用户的字符串。

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

    要发送包含文件获取内容的cookie,我创建一个流式上下文:

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

    我正在检索以下内容:

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

    但现在我得到了错误:

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

    有人知道我在干什么吗?

    编辑: 忘记提一下:如果没有流式处理上下文,页面只加载。但是没有饼干,我就得不到我需要的信息。

    4 回复  |  直到 9 年前
        1
  •  27
  •   Alana Storm    16 年前

    首先,这可能只是您的问题中的一个拼写错误,但是文件获取内容()的第三个参数需要是流式上下文,而不是选项数组。我用这样的东西做了一个快速测试,结果一切正常

    $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。尝试获取URL 从运行PHP的计算机 从您的工作站/台式机/笔记本电脑。可能是您的Web服务器在访问该站点时遇到问题,您的本地计算机有一个缓存副本,或者其他一些网络问题。

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

    确保$_server['http_cookie']具有您认为它具有的原始cookie。

    如果你在截屏,下载火狐和livehttpheaders扩展的副本。在火狐中执行所有必要的步骤以访问您想要的任何页面。然后,使用livehttpheaders的输出,重新创建完全相同的请求需求。包括每个标题, 只有饼干。

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

        2
  •  9
  •   Eliasz Kubala    9 年前

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

    解决这个问题的一种方法是使用 session_write_close() 打开文件并重新锁定 SistSuxSistar() .

    例子:

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

    自从 文件获取目录() 是一个阻塞函数,两个脚本在尝试修改会话文件时都不会并发。

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

    顺便说一句:它比 卷曲 FSOCKON()

    如果你找到更好的,告诉我。

        3
  •  1
  •   SomeKittens    12 年前

    只是出于好奇,你在尝试 file_get_contents 在有空间的页面上?我记得我试着在一个名称中有空格的URL上使用fgc,虽然我的Web浏览器分析得很好,但是fgc没有。最后我不得不使用 str_replace 将“”替换为“%20”。

    我认为这应该是相对容易发现的,尽管它只报告文件名的一半。另外,我注意到在其中一篇文章中,有人在定义邮件头时使用了\r\n。请记住,PHP不喜欢这些单引号,但它们在双引号中可以正常工作。

        4
  •  0
  •   Sebastian Hoitz    16 年前

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