由于以下重定向,存储会话数据失败

时间:2016-01-16 14:36:43

标签: php session cookies httprequest http-status-code-302

我想在302重定向发生之前将会话数据存储到同一页面,只是没有一些原始请求参数。

例如:

  1. 访客前往domain.com/?ab_saveme=hey
  2. hey值将被存储
  3. 访问者将被重定向到domain.com/
  4. 页面将输出hey
  5. 这是我附带的代码,它执行重定向,但它没有设法存储值(hey未被输出)。

    没有重定向块,它会将其存储正确。

    <?php
    session_start();
    session_name("hello");
    $_SESSION['cache']=$_GET['ab_saveme']; // store the `saveme` value
    
    // begin self redirect code
    
    function unparse_url($parsed_url) {
      $scheme   = isset($parsed_url['scheme']) ? $parsed_url['scheme'] . '://' : '';
      $host     = isset($parsed_url['host']) ? $parsed_url['host'] : '';
      $port     = isset($parsed_url['port']) ? ':' . $parsed_url['port'] : '';
      $user     = isset($parsed_url['user']) ? $parsed_url['user'] : '';
      $pass     = isset($parsed_url['pass']) ? ':' . $parsed_url['pass']  : '';
      $pass     = ($user || $pass) ? "$pass@" : '';
      $path     = isset($parsed_url['path']) ? $parsed_url['path'] : '';
      $query    = !empty($parsed_url['query']) ? '?' . trim($parsed_url['query'], '&') : '';
      $fragment = isset($parsed_url['fragment']) ? '#' . $parsed_url['fragment'] : '';
      return "$scheme$user$pass$host$port$path$query$fragment";
    }
    
    function strip_query($url, $query_to_strip) {
      $parsed = parse_url($url);
      $parsed['query'] = preg_replace('/(^|&)'.$query_to_strip.'[^&]*/', '', $parsed['query']);
      return unparse_url($parsed);
    }
    
    $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    
    
    $new_url = (strip_query($url, 'ab')); # or whatever query you want to strip/keep
    
    
    $filtered = array_filter(array_keys($_GET), function($k) {
        return strpos($k, 'ab') === 0;
    });
    
    if ( !empty($filtered) ) {
        header ("Location: $new_url");
    }
    
    // end self redirect code
    
    echo $_SESSION['cache']; // needs to echo original `saveme` value
    echo session_id();
    if (is_writable(session_save_path()))
    {
        echo "writable";
    }
    ?>
    

    修改

    感谢Zimmi,我注意到我正在重新存储空值。

    处理此问题的最佳做法是改变:

    $_SESSION['cache']=$_GET['ab_saveme']; // store the `saveme` value
    

    成:

    if (!empty($_GET['ab_saveme'])) {
    $_SESSION['cache']=$_GET['ab_saveme']; // store the `saveme` value
    }
    

    还是有更好的方法吗?因为我可能必须为各种参数(例如ab_1ab_2

    执行此操作

0 个答案:

没有答案