PHP 8.0下php.ini与session_set_cookie_params跨子域配置语法咨询
配置说明
1. php.ini 内session cookie相关配置语法
php.ini中session相关的字符串配置项可以加引号也可以不加,包含特殊字符时建议加双引号避免解析错误,实现子域名共享session的配置示例如下:
; session有效期,单位秒,这里设为10分钟 session.cookie_lifetime = 600 ; 全站路径生效 session.cookie_path = "/" ; 前面加.表示所有子域名都可以读取该session cookie session.cookie_domain = ".mywebsite.com" ; 开启后仅HTTPS请求才会携带session cookie,HTTP站点设为Off session.cookie_secure = On ; 开启后禁止JS读取session cookie,防范XSS攻击 session.cookie_httponly = On
配置修改后需要重启PHP-FPM或者Web服务器生效。
2. 代码中调用session_set_cookie_params的正确写法
你对调用时机的理解是正确的:如果不通过php.ini配置,确实需要在每次请求的session_start()之前调用该函数。
你初步编写的代码存在几个错误:
- 参数顺序混淆:第二个参数是路径
$path,第三个才是域名$domain - 字符串参数值没有加引号包裹
- 传参不需要写变量名(PHP8+命名参数写法除外)
- 调用函数时不需要写
: bool返回类型声明,仅定义函数时需要
其中domain参数值开头加.是实现所有子域名共享session的关键,比如.mywebsite.com可以让a.mywebsite.com、b.mywebsite.com等所有子域名都读取到同一个session cookie
兼容所有PHP版本的写法
<?php // 参数顺序:有效期、生效路径、生效域名、是否仅HTTPS、是否禁止JS读取 session_set_cookie_params(600, '/', '.mywebsite.com', isset($_SERVER['HTTPS']), true); session_start(); // 业务代码写在后面 ?>
PHP8.0+ 命名参数写法(无需记忆参数顺序)
<?php session_set_cookie_params( lifetime_or_options: 600, path: '/', domain: '.mywebsite.com', secure: isset($_SERVER['HTTPS']), httponly: true ); session_start(); // 业务代码写在后面 ?>
内容的提问来源于stack exchange,提问作者nwood21
相关产品推荐
相关产品推荐

