您的位置:首页 > 编程语言 > PHP开发

PHP session跨页面访问失效问题处理

2018-11-30 13:36 155 查看

PHP session跨页面访问失效问题处理

  • 参考文章列表
  • 环境

    使用了 LNMP提供的环境,版本1.2.
    CentOS 7.2
    PHP 5.4
    Nginx 1.1

    问题说明

    在使用session时,出现了本页面可读取刚设置好的session,跨页面获取不到的问题.测试后发现每次访问都会创建新的session_id().在没有跨域的情况下对配置进行逐项尝试

    php.ini 部分配置

    php session 此前的部分配置,把正确和错误的分为两类

    ;正常的部分
    session.auto_start = 0
    session.save_handler = files
    session.name = PHPSESSID
    session.cache_limiter =
    session.cache_expire = 180
    ;错误的部分
    session.save_path = "/var/lib/php/session"session.cookie_path = "/var/lib/php/session"
    session.cookie_lifetime = 0
    session.use_cookies = 0
    session.use_only_cookies = 0
    session.use_trans_sid = 0

    检查目录权限

    先检查目录权限,配置文件中的此目录权限可能有问题

    session.save_path = "/var/lib/php/session"

    为了排除问题,先把session文件保存目录改为有权限的目录.然后执行代码并给对应的session赋值.检查目录中有没有生成sess_开头的session文件,打开文件查看里面的值是否正确

    session.save_path = "/tmp"

    检查session设置

    看论坛洪兽的文章解释了PHP.ini文件关于session配置cookie和URL传递方式,
    链接:session跨页面失效

    session的传递有两种方式,一种是基于cookie传递,另一种是基于URL传递。
    cookie传递即通过cookie将session信息保存在客户端,之后在向服务器发送请求时会自动带上cookie信息,以便服务器读取。这是常用的方式。
    URL传递是在点击跳转的链接后自动添加session信息,如a.php?sessid=…,之后在新页面自动$_GET[‘sessid’]来读取。这个过程是自动且隐藏的,跟用cookie传递一样不知不觉。

    看文章后发现目前的配置方式错误,没有使用cookie方式也没有使用URL方式

    session.use_cookies = 0
    session.use_only_cookies = 0
    session.use_trans_sid = 0

    测试后发现URL传递PHPSESSID正常,但业务需使用cookie来存储session.将模式改为如下

    session.use_cookies = 1
    session.use_only_cookies = 1
    session.use_trans_sid = 0

    检查cookie设置

    模式正常以后发现跨页面还是失效,于是检查服务端有没有发送Cookie到客户端
    在session_start()后面增加代码将session发送到客户端,session正常使用,但删除此代码后session失效

    session_start();
    //手动发送session_id的cookie到客户端
    setcookie('PHPSESSID', session_id(), time()+3156000);

    使用PHP默认方式发现cookie中没有对应的PHPSESSID字段,但用PHP的setcookie()后有PHPSESSID字段.
    于是查看Response Headers里的Set-Cookie信息

    PHP默认发送的Set-Cookie值为

    Set-Cookie:PHPSESSID=ldh2it7s9qa18c4lcrplsb4540; path=/var/lib/php/session

    使用PHP的setcookie()方法后客户端收到的Set-Cookie为:

    Set-Cookie:PHPSESSID=ldh2it7s9qa18c4lcrplsb4540; expires=Sat, 05-Jan-2019 16:17:20 GMT

    检查cookie配置

    session.cookie_lifetime = 0
    session.cookie_path = "/var/lib/php/session"

    修改为如下配置后,默认方式和手动设置的两者Set-Cookie一致,cookie中出现了PHPSESSID,session跨页面问题解决

    session.cookie_lifetime = 1440
    session.cookie_path =

    最后,将session方式改为兼容URL和cookie.正确的配置如下:

    session.save_path = "/tmp"session.cookie_path =
    session.cookie_lifetime = 1440
    session.use_cookies = 1
    session.use_only_cookies = 1
    session.use_trans_sid = 1
    

    参考文章列表

    https://www.geek-share.com/detail/2477563280.html
    https://www.geek-share.com/detail/2730811401.html
    https://www.geek-share.com/detail/2684178170.html

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: