会话数据的file_get_contents(或curl或fopen)问题

2 php session fopen curl file-get-contents

我有一个显示会话值的页面,我们称之为www.domain-a.com/master.php,如果我直接从浏览器输入,它会显示会话值.

但是当我尝试从另一个域(例如www.domain-b.com/slave.php)下载file_get_contents(或其他方法)时,它不会检索会话保护的内容,只是一个空白页面.

我知道这是因为server-b正在尝试检索内容,而不是用户...

任何人都知道如何告诉域 - 一个谁正在检索信息是用户?有一种方法来检索会话值?

问候,

何塞

Mic*_*y H 18

有一个有用的解决方案.

将PHPSESSID发送到另一台服务器没有意义,因为会话数据存储在服务器上的文件中,这就是file_get_contents阻止http服务的原因.很简单.客户端使用http连接到服务器,服务器打开文件,其中包含用于写入的会话数据.file_get_contents创建连接到同一服务器的另一个连接(另一个线程).如果设置了会话ID,则服务器会打开具有会话数据的相同文件,但此文件已打开.

所以这是一个防止这种碰撞的好方法:

$opts = array( 'http'=>array( 'method'=>"GET",
              'header'=>"Accept-language: en\r\n" .
               "Cookie: ".session_name()."=".session_id()."\r\n" ) );

$context = stream_context_create($opts);
session_write_close();   // this is the key
$obsah = file_get_contents( 'http://blablabla.cz', false, $context);
Run Code Online (Sandbox Code Playgroud)

它工作正常.对对对


Gum*_*mbo 5

您可能需要在cookie中发送用户的会话ID以及请求.

如果要使用该file_get_contents功能,则必须创建一个上下文来设置cookie:

$opts = array(
    'http' => array(
        'method' => 'GET',
        'header' => 'Cookie: PHPSESSID=0123456789abcdef0123456789abcdef'
    )
);
$context = stream_context_create($opts);
echo file_get_contents('http://master.example.com/master.php', 0, $context);
Run Code Online (Sandbox Code Playgroud)