Session 使用基于URL的会话管理运行Drupal 7?

Session 使用基于URL的会话管理运行Drupal 7?,session,drupal-7,Session,Drupal 7,由于客户的要求,我面临着开发一个Drupal7站点,该站点不能使用cookies进行会话管理 帮助站点上的几个旧线程建议只需在站点的settings.PHP中设置相关的PHP配置: ini_set('session.use_cookies', '0'); ini_set('session.use_only_cookies', '0'); ini_set('session.use_trans_sid', '1'); 然而,尽管这在11年前可能奏效,但现在却行不通 快速查看core session

由于客户的要求,我面临着开发一个Drupal7站点,该站点不能使用cookies进行会话管理

帮助站点上的几个旧线程建议只需在站点的settings.PHP中设置相关的PHP配置:

ini_set('session.use_cookies', '0');
ini_set('session.use_only_cookies', '0');
ini_set('session.use_trans_sid', '1');
然而,尽管这在11年前可能奏效,但现在却行不通

快速查看core session.inc文件可以发现原因:Drupal的整个会话处理都是在假定cookie可用的情况下编写的

但是,可以通过在
session\u inc
变量中提供新处理程序的路径来覆盖使用的会话处理程序

因此,我可以通过编写一个新版本的session.inc并加载它来解决这个问题,而不是加载另一个版本,但如果不需要的话,我宁愿不要


我找不到最近有人提到过这个话题,但是如果有人能提供一些资源,或者一些关于如何重写session.inc的建议,我很高兴听到他们的建议。

因此,实现这个目标需要三件事:

  • settings.php
    文件中的条目:

    $conf['session_inc'] = 'sites/all/modules/custom/my/session.inc';
    
    ini_set('session.use_cookies', '0');
    ini_set('session.use_only_cookies', '0');
    ini_set('session.use_trans_sid', '1');
    
  • 制作修改后的
    session.inc
    。主要是使用
    $\u GET
    代替
    $\u COOKIES
    。(我最终剥离了HTTPS使用的所有额外安全性,以使另一方的生活更轻松。)
  • 在模块中放置一个
    hook\u drupal\u goto\u alter

    function my_drupal_goto_alter(&$path, &$options, &$http_response_code) {
        if (ini_get('session.use_trans_sid')) {
            if (!isset($options['query'])) $options['query'] = array();
    
            $options['query'][session_name()] = session_id();
        }
    }
    
  • 对于那些担心安全方面的人来说:这种相当不安全的机制只能从一个特定的服务器访问。该服务器将有一个指向未绑定子域的HOSTS条目,该子域将有自己的settings.php文件。任何通过普通域访问站点的人都将得到正常的Drupal会话处理;任何人从错误的IP地址访问子域都将被阻止