我正在尝试将用户重定向到他们在尝试登录之前查看的页面。例如,如果他们正在查看baseurl/people/abraham_lincoln,然后决定登录,那么在登录后,他们将被重定向到baseurl/people/abraham-lincoln。奇怪的是,它适用于某些URL,而不适用于其他URL。对于某些URL,我会将"javascript/jsFunctions.js"附加为URL,而不是它们以前所在的URL。
在每个控制器的顶部,我设置了一个会话变量来进行重定向:
$this->session->set_userdata('Redirect', current_url());
出于测试目的,我正在将此会话变量打印到控制器的顶部和日志视图的顶部。以下是我登录时收到的一些结果。
正在工作的URL示例:
我尝试登录的URL:
baseURL/people
在我的控制器顶部打印的重定向会话变量是什么:
baseURL/people
在我的日志视图顶部打印的内容是我的重定向会话变量:
baseURL/people
URL不起作用的示例:
我尝试登录的URL:
baseURL/people/abraham_lincoln
在我的控制器顶部打印的重定向会话变量是什么:
baseURL/people/abraham_lincoln
在我的日志视图顶部打印的内容是我的重定向会话变量:
baseURL/people/javascript/jsFunctions.js
我不确定这是否重要,但我也在路由routes.php文件中的一些URL:
$route['people/(:any)'] = "people/index/$1";
$route['people/(:any)/(:num)'] = "people/index/$1/$2";
我尝试了许多不同的方式来构建我的会话变量,包括:
current_url()
base_url().uri_string()
base_url().$this->uri->segment(1)....
base_url().$this->uri->rsegment(1)....
如果有人能想到为什么我要得到那些javascript变量而不是我要找的URL,我会很感激任何输入。
谢谢!
附言:我忘了提一下,如果我刷新一个不工作的页面,例如abraham_incoln页面,然后登录,我会收到正确的重定向会话变量。几乎就像第一次没有正确设置一样,但我不知道如何解决这个问题,因为我已经尝试在视图加载之前在顶部和右侧设置会话变量。
用例应该只适用于登录过程。因此,把它放在每个控制器的顶部可能不是我们想要的。
您不应该在开始时将current_url放入会话中,而是应该将其附加到登录链接中
<?php echo anchor('/home/login/' . url_encode(current_url()), 'login');?>
在登录功能中
<?php
public function login($redirecturl) {
$this->form_validation->set_rules('username', 'Username', 'required');
// etc.
if($this->form_validation->run()) {
$query = "select id from users where username=? and password=sha(?)";
// etc.
$this->session->set_userdata('userid', $row->id);
redirect($redirecturl);
} else {
$data['redirecturl']=$redirecturl;
$data['content']='loginview';
$this->load->view('template', $data);
}
}
?>
在登录视图中
<?php
echo form_open('/home/login/' . url_encode($redirecturl));
// etc.
?>