我正在使用CakePHP 3在子域上构建应用程序。
用户登录使用vanilla PHP(5.x)
编写的https://example.com/
Cake应用程序位于https://app.example.com/
。我已将以下内容添加到config/app.php
。这样做的意思是Cake应用程序可以从登录域(https://example.com
)读取会话变量。
'Session' => [
'defaults' => 'php',
'cookie' => 'PHPSESSID',
'timeout' => '0',
'ini' => [
'session.cookie_domain' => '.example.com',
'session.cookie_httponly' => 'on'
]
]
所有这一切都很好。我可以打印https://example.com
上由https://app.example.com
设置的会话变量。
但是,我不相信Cake实际上正确地处理了配置(甚至根本不使用它)......
我很好奇session.cookie_domain
如何运作,所以开始改变价值。最后,我把它改成了无意义的东西,比如
'session.cookie_domain' => 'ksjdhshfksdf'
并且它仍然像以前一样工作。
我可以“打破”它的唯一方法是将'cookie' => 'PHPSESSID'
设置为'cookie' => 'CAKEPHP'
,这会使会话无法读取(因为它将返回到Cake自己的会话处理程序而不是“vanilla”) PHP一个?)
请有人解释一下,或者是否根据我的需要设置错误?
顺便提一下,服务器的php.ini
已配置为包含session.cookie_domain = ".example.com"
。我不清楚这可能是问题所在 - 也许是因为Cake正在使用php.ini
进行会话设置,数组的ini
部分实际上没有意义?
答案 0 :(得分:3)
session.cookie_domain
选项仅影响编写会话Cookie,而不是读取它们。用户代理决定是否在请求旁边发送cookie,具体取决于服务器在响应cookie时响应的域设置。
当用户代理发送cookie时,将没有域配置值,只有cookie名称及其值,因此PHP即使想要也无法使用域设置,它只是具有不知道饼干最初源于哪里。
在服务器端,会话总是由PHP本身初始化,所有CakePHP都可以调用session_start()
,对PHP来说唯一重要的是cookie名称及其值。如果cookie名称与配置的会话cookie名称匹配,那么它的值将用于标识可能的会话(这是自定义会话处理程序可以挂钩的位置),这就是服务器端关于选择的所有内容会议。
错误cookie_domain
设置可能会破坏的是会话续订,因为它会破坏会话存储,并编写一个带有域值的cookie,这会导致用户代理在后续请求中不发送它