Codeigniter 3.1.3重定向

时间:2017-04-05 19:28:24

标签: php codeigniter session redirect

考虑这种控制器方法

public function authenticate_session($user, $access_token) {
    $this->output->enable_profiler(TRUE);

    $user = $this->user_model->find_users(array("email" => $user, "access_token" => $access_token), "email, last_activity, access_token");

    if ($user) {
        $this->load->library('session');

        $this->session->set_flashdata('post_data', $this->input->post(NULL));

        redirect("v1/transactions_controller/pay");
    } else {
        redirect("v1/sessions/unauthenticated");
    }
}

交易控制器中的付款方式

public function pay() {
        $this->output->enable_profiler(TRUE);

        $this->load->library('session');

        var_dump($this->session->flashdata());
}

var_dump($this->session->flashdata());给了我array(0) { }

我已经检查了我知道的所有地方,每个人似乎都说会话库中的flash_data对我来说是最好的选择。我需要在用户通过身份验证后将初始请求中的POST参数传递给事务控制器。如果我删除了重定向,只需执行var_dump($this->session->flashdata());我就能看到我所期望的内容(来自上一个请求的POST数据),但是在重定向后它没有通过。

使用redirect("v1/transactions_controller/pay", "refresh");似乎并没有真正转到新控制器,而是在身份验证控制器方法上刷新,但我确实看到了我的flashdata。难道我做错了什么?我的服务器是否应该以某种方式配置才能正常工作? 我已经将session_start()添加到我的index.php中,但是它引发了一个错误,因为它已经在会话库中,它由需要它的两个控制器加载。

我在config.php中的会话和cookie变量

$config['cookie_prefix']    = '';
$config['cookie_domain']    = 'localhost';
$config['cookie_path']      = '/';
$config['cookie_secure']    = FALSE;
$config['cookie_httponly']  = FALSE;

$config['sess_driver'] = 'files';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;

4 个答案:

答案 0 :(得分:1)

您的问题在于会话配置。使用文件时,必须将驱动程序$config['sess_save_path']设置为绝对路径,并且需要设置权限 - 可能设置为0700.会话数据保存在您设置的文件夹中的文件中。没有文件===没有会话数据。

另外,我建议改变一个cookie设置

$config['cookie_domain'] = '';

由于您似乎需要在整个网站中使用此功能,因此我建议您自动加载会话库。这在文件application/config/autoload.php中完成。 找到文件中的$autoload['libraries]项并将其设置为这样。

$autoload['libraries'] = array('session');

现在您不必将其加载到应用程序的任何其他位置。

文件中的注释说明了如何一次加载多个库。

出于安全考虑,建议将会话文件夹放在公共html文件之外。创建一个名为" sessions"的文件夹。与您网站的根目录处于同一级别。这通常是安装Codeigniter的文件夹。将此文件夹的权限设置为0700.所有者可能需要是" www-data"。如有疑问,请在htdocs文件夹中使用相同的所有者。

假设htdocs 您的根文件夹将其放在config.php的sessions部分中。

$config['sess_save_path'] = substr(FCPATH, 0, strpos(FCPATH, "htdocs/"))."sessions/";

常量FCPATH由Codeigniter定义,是应用程序根目录的绝对路径 - index.php文件的存储位置。代码剥离" htdocs /"并用" sessions /"替换它。你应该好好去。如果您的root不是htdocs更改" htdocs /" to" yourRootFolderName /"在strpos

在我的测试平台服务器上,FCPATH定义的路径如下所示

/var/www/htdocs/

所以sessions文件夹位于

/var/www/sessions/

如果您在Windows计算机FCPATH上使用WAMP或类似堆栈,可能看起来更像这样。

C:\wamp\www\htdocs\

答案 1 :(得分:1)

您需要为会话创建路径

https://www.codeigniter.com/user_guide/libraries/sessions.html#session-preferences

更改

$config['sess_save_path'] = NULL;

如下所示,并确保设置权限0700

$config['sess_save_path'] = APPPATH . 'cache/sessions/';

Codeigniter path functions definitions

  

EXT:PHP文件扩展名

     

FCPATH:前端控制器的路径(此文件)(CI的根目录)

     

SELF:THIS文件的名称(index.php)

     

BASEPATH:系统文件夹的路径

     

APPPATH:“应用程序”文件夹的路径

还要保存闪存数据

$this->session->keep_flashdata('item');
$this->session->keep_flashdata(array('item1', 'item2', 'item3'));

和codeigniter session tempdata

https://www.codeigniter.com/user_guide/libraries/sessions.html#tempdata

$config['cookie_domain'] = '.localhost';

答案 2 :(得分:0)

CodeIgniter支持“flashdata”或仅可用于下一个服务器请求的会话数据,然后自动清除。

是第一件事,这显然意味着你需要做一个新的服务器请求。重定向,刷新,链接或其他一些意思,用于将用户发送到下一个请求。

如果您在同一个请求中使用flashdata,为什么还要使用flashdata?您也可以不使用flashdata或使用常规会话。

答案 3 :(得分:0)

与大多数没有意义的事情一样,我发现只有一个小错误需要纠正:我需要在config.php中设置我的base_url();

$config['base_url'] = 'http://localhost/my_ci_site';