2015-05-03 7 views
1

мне нужно перенаправить пользователя на страницу они пришли, как только они успешно сделали один из двух вещей:. 1) Ввод их код приглашения, или 2) Записан вTrouble перенаправлять на предыдущую страницу после авторизации

Я пытаюсь применить ответ опубликован here, но, проведя несколько часов безуспешно, пытаясь заставить его работать, я понял, что пришло время обратиться за помощью.

Для того, чтобы убрать код, я включил только фрагменты, относящиеся к Варианту 1 (Пригласительный код). Кроме того, чтобы сначала заставить его работать с более простой версией (и более точно воспроизвести приведенный пример), я временно удалил iframes с этих страниц.

Код Добавление

auth_invite_launch.php

//CODE #1 
header("Location:sign_in.php?location=".urlencode($_SERVER['REQUEST_URI'])); 
$redirect = NULL; 
if ($_POST['location'] != '') { 
    $redirect = $_POST['location']; 
} 

sign_in.php

//CODE #2 
echo '<input type="hidden" name="location" value="'; 
if (isset($_GET['location'])) { 
    echo htmlspecialchars($_GET['location']); 
} 
echo '" />'; 

invite_code - exec.php (sign_in.php представлен здесь)

//CODE #3 
if ($redirect)) { 
    header("Location:".$redirect); 
} 

Предсуществующая Код

createaccount.php

require_once('config/auth_invite_launch.php'); // session_start & checks if authorized 
is_user_auth(); // Checks if authorized 
is_user_logged(); // Checks if logged in 
get_logged_user_id(); 
if (is_user_logged() == TRUE) { 
    $logged_in = true; 
    $user_id = $_SESSION['SESS_USER_ID']; 
} 

auth_invite_launch.php

function is_user_auth(){ 
    // Checks if logged in to Member Account or has valid Invite Code 
    if (isset($_SESSION['SESS_USER_ID']) || isset($_SESSION['TEMP_INVITE_ID'])){ 
     return true; 
    } 
    //Replaced by CODE #1 
    header("location: sign_in.php"); // Redirects if not authorized user 
} 
// Checks if logged in to member account 
function is_user_logged(){ 
if (isset($_SESSION['SESS_USER_ID'])){ 
     return true; 
    } 
     return false; 
} 
// Retrieves ID if logged in to member account, NULL otherwise 
function get_logged_user_id(){ 
    if (is_user_logged() === TRUE){ 
     return $_SESSION['SESS_USER_ID']; 
    } 
     return null; 
} 

invite_code - exec.php (sign_in.php представлен здесь)

// PRECEDED BY statement to fetch matching invite codes from db 
if ($stmt - > rowCount() == 1) { 
    $invite = $stmt - > fetch(); 
    $_SESSION['TEMP_INVITE_ID'] = $invite['idinvite_codes']; 
    $_SESSION['TEMP_INVITE_CODE'] = $invite['invitation_code']; 
    $invite_code = "true"; 
    //CODE #3 Added here 
} else { 
    $invite_code = "false"; 
    header("location: index.php"); 
    exit(); 
} 
+1

Мое первое наблюдение заключается в том, что вы иногда выполняете перенаправление «Местоположение» (например, в 'auth_invite_launch.php') без немедленного' exit() '. PHP не знает, что заголовок местоположения должен прервать скрипт, так что весело продолжайте движение, пока он не обнаружит, что удаленная сторона отключена. Поскольку между выпуском заголовка и отключением (в зависимости от скорости сетевого подключения) существует задержка между кажущейся случайной величиной скрипта после того, как заголовок может быть выполнен, и это может вызвать некоторые неудобные ошибки. Исправьте этот первый ':-)'. – halfer

+0

@halfer Done :-) Но, как я понял из вашего поста, это не исправить полностью ;-) –

+0

Нет, я надеялся, что это может исправить! хотя только потому, что ошибки, которые могут вызывать, кажутся очень случайными. Хорошо, поэтому нам может потребоваться более подробная информация - у вас есть два действия, в которых вы хотите, чтобы пользователь перенаправлялся обратно туда, откуда он появился, но они не работают. Можете ли вы усилить «не работает» здесь? Переадресовывают ли они, но не в нужное место? Или они не перенаправляют вообще? – halfer

ответ

1

Ваш последний вопрос в комментариях довольно широк: как отследить путь выполнения в цикле форм-редиректа? Я отдам его.

Давайте предположим, что ваши авторизованные только сценарии имеют устройство обнаружения Логин, так что если пользователь не вошел в систему, он будет перенаправлять к системе авторизации:

if (!isLoggedin()) 
{ 
    header('Location: /login.php?location=' . urlencode(getCurrentUrl())); 
    exit(); 
} 

Таким образом, в вашей форме входа в систему, вы будете хотите действие POST, со скрытым полем для расположения перенаправления (это выглядит как у вас есть это в sign_in.php):

<?php 
// Handle post 
if ($_POST) 
{ 
    if (loginCorrect()) 
    { 
     // Redirect to the redirect location 
     // cleanUrl() should ensure the user input pertains to a 
     // local script name, so it cannot be used as a spammer's 
     // redirection device 
     header('Location: ' . cleanUrl($_POST['redirect'])); 
     exit(); 
    } 
} 
?> 
<form method="post"> 
    <!-- hidden field containing redirect location --> 
    <!-- username/password fields --> 
</form> 

Тогда можно было бы ожидать для URL, чтобы добраться до места переадресации.Это четыре страницы (один повтор):

  • Сделать запрос авторизованного только страницы
  • Перенаправление на страницу входа, если не авторизованы
  • сообщение либо самостоятельно или Войти страницу обработчика
  • Перенаправление на первоначально запрашиваемая страница, при условии, что учетные данные верны

Каждый из них может быть отлажен. Пуристы скажут, что вы должны использовать xDebug и отладчик (контролируемый из вашей среды IDE), но echo и exit в порядке. Просто добавьте их в верхней части четырех страниц выше, и посмотреть, если местоположение редирект (или другие переменные) являются правильными:

echo 1; 
exit(); 

Иногда я добавлю несколько из них, чтобы увидеть, как контроль работы в пределах одной страницы , Управление версиями здесь почти существенно, так как важно иметь возможность легко их удалять - вы, разумеется, не хотите разворачивать код, содержащий отладочные операторы.

Также необходимо использовать View Source на странице своей формы входа, чтобы обеспечить правильное заполнение скрытого поля.

+0

Я не уверен, почему мне сложно выполнять ваши очень простые инструкции: (Но хорошая новость в том, что я смог выяснить, в чем проблема был другим способом, используя исходный код (с iframes), который, как я знал, фактически работал - он просто возвращал пользователю index.php после того, как они вошли в систему и потребовали, чтобы они снова нажали на нужную ссылку, поскольку он все еще делает то же самое, даже если я вставил новый код, кажется, что проблема в том, что я пытаюсь передать нужное место через –

+0

Сложно сказать @Chaya - Интересно, что фреймворки вещи путают. находится в том же домене, верно? Ифраметры, указывающие на разные домены, обычно изолируются в терминах сеанса от остальной части приложения. – halfer

+0

Если есть перенаправление на 'index.php', то похоже, что в системе входа есть функция перенаправления, которую вы не учли (возможно, вы ее пропустили?). Найдите 'index.php' в своем исходном коде и посмотрите, можете ли вы его найти. Конечно, может показаться, что это то, что пользователь хочет перенаправить, и в этом случае может возникнуть проблема с записью скрытого поля (см. Здесь «Источник источника»). – halfer

Смежные вопросы