Переадресация на URL-адрес референта в кодеригнере
В системе обмена сообщениями моего проекта, когда вы получаете сообщение от пользователя, вы получаете оповещение по электронной почте о том, что другой пользователь отправил сообщение, чтобы просмотреть сообщение, щелкнув здесь (то есть URL-адрес сообщения). Так, если пользователь не зарегистрирован в систему он перенаправляется на страницу входа в систему, и после входа в систему он должен вернуться к URL-адресу реферирования. Я сделал базовый контроллер в основной папке и расширил CI_controller, код аутентификации выглядит следующим образом.
function authenticate($type = 'user')
{
if($type == 'user')
{
if($this->user_id)
{
// user is logged in. check for permissions now
}
else
{
// user isnt logged in. store the referrer URL in a var.
if(isset($_SERVER['HTTP_REFERER']))
{
$redirect_to = str_replace(base_url(),'',$_SERVER['HTTP_REFERER']);
}
else
{
$redirect_to = $this->uri->uri_string();
}
redirect('user/login?redirect='.$redirect_to);
exit;
}
}
if($type == 'admin')
{
if($this->session->userdata('admin_id') && $this->session->userdata('user_type') ==5)
{
// Admin is logged in
}
else
{
redirect('admin/login');
exit;
}
}
}
URL-адрес реферала: "http://example.com/project/pm/view_conversation?id=11"
теперь проблема в том, что я получаю URL-адрес реферала до view_conversation и не могу получить идентификационную часть.
Любое предложение?
Спасибо.
Ответы
Ответ 1
Это может помочь:
CI 2+
https://www.codeigniter.com/userguide2/libraries/user_agent.html
CI 3+
http://www.codeigniter.com/user_guide/libraries/user_agent.html
$this->load->library('user_agent');
if ($this->agent->is_referral())
{
echo $this->agent->referrer();
}
Ответ 2
Как насчет просто
redirect($_SERVER['HTTP_REFERER']);
Использование глобальной переменной php $_SERVER
.
Это сработало для меня!
Ответ 3
Поскольку у вас есть двойной знак вопроса в URL-адресе, браузер игнорирует часть URL-адреса после второго. Используйте urlencode для перенаправления части, например:
redirect('user/login?redirect='.urlencode($redirect_to));
Я тестировал его, и он работает таким образом.
Ответ 4
По умолчанию CI настроен на игнорирование части запроса URL-адреса (часть после "?" ).
Смотрите: http://codeigniter.com/user_guide/general/urls.html
Ответ 5
Поместите этот код в свой контроллер входа
function index() {
$this->load->library('user_agent'); // load user agent library
//Set session for the referrer url
$this->session->set_userdata('referrer_url', $this->agent->referrer() );
}
Код переадресации входа
// user is authenticated if referrer is there
if( $this->session->userdata('referrer_url') ) {
//Store in a variable so that can unset the session
$redirect_back = $this->session->userdata('referrer_url');
$this->session->unset_userdata('referrer_url');
redirect( $redirect_back );
}