CakePHP 3 - 通过子域

时间:2017-06-16 14:40:54

标签: php session cakephp cookies

我正在使用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部分实际上没有意义?

1 个答案:

答案 0 :(得分:3)

session.cookie_domain选项仅影响编写会话Cookie,而不是读取它们。用户代理决定是否在请求旁边发送cookie,具体取决于服务器在响应cookie时响应的域设置。

当用户代理发送cookie时,将没有域配置值,只有cookie名称及其值,因此PHP即使想要也无法使用域设置,它只是具有不知道饼干最初源于哪里。

在服务器端,会话总是由PHP本身初始化,所有CakePHP都可以调用session_start(),对PHP来说唯一重要的是cookie名称及其值。如果cookie名称与配置的会话cookie名称匹配,那么它的值将用于标识可能的会话(这是自定义会话处理程序可以挂钩的位置),这就是服务器端关于选择的所有内容会议。

错误cookie_domain设置可能会破坏的是会话续订,因为它会破坏会话存储,并编写一个带有域值的cookie,这会导致用户代理在后续请求中不发送它