我正在尝试设置Cookie以查看来自AWS Cloudfront的私人内容
他们给出了一个示例cookie标题:
Set-Cookie: Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly; CloudFront-Key-Pair-Id=APKA9ONS7QCOWEXAMPLE
我创建了以下php代码
setcookie (
'CloudFront-Key-Pair Id',
'MYID',
0,
'/',
'mycloudfrontsub.cloudfront.net',
true,
true
);
但是没有设置cookie。只有在我取出域名时才设置cookie。
我认为这是因为在session_start之后在脚本中调用了setcookie。我尝试添加它,但在session_start()
之前需要它session_set_cookie_params(0, '/', 'duvoxso6rm38g.cloudfront.net);
我需要做这样的事吗?
//close local session, then open new one for aws
$id=SID;
session_write_close();
session_set_cookie_params(0, '/', 'mysub.cloudfront.net');
session_start();
setcookie(...);
session_write_close();
session_set_cookie_params(0, '/', 'originaldomain.com');
session_start();
答案 0 :(得分:7)
由于您从域B发送域A的cookie,因此cookie不会显示在浏览器中。出于安全原因,浏览器会默默忽略这些cookie。这是一个浏览器功能,而不是PHP的东西。
如果您想在CloudFront中使用已签名的Cookie,则需要为CloudFront分配使用CNAME,该分布是您的PHP服务器域的子域。更详细的答案可以在https://mnm.at/markus/2015/04/05/serving-private-content-through-cloudfront-using-signed-cookies/
下找到简而言之:假设您要使用域 example.com 。您在 www.example.com 下提供PHP文件。然后,您可以将CNAME media.example.com 用于d111111abcdef8.cloudfront.net。要将Cookie从PHP端发送到CloudFront服务器,您需要在Cookie中使用域 example.com 。
引用的网站还注意到您应该使用PHP函数 header()来发送cookie,而不是 setcookie()。这是因为setcookie函数执行了一些编码,这些编码会破坏使用网站上提到的功能创建的歌唱参数。