Мне нужно перенаправить пользователя на страницу, с которой он пришел, после того, как он успешно выполнил одно из двух действий: 1) ввести свой код приглашения или 2) войти в систему.
Я пытаюсь применить ответ опубликован Вот, но потратив несколько часов безуспешно пытаясь заставить его работать, я понял, что пришло время обратиться за помощью.
Чтобы сократить код, я включил только фрагменты, относящиеся к варианту 1 (код приглашения). Кроме того, чтобы сначала заставить его работать с более простой версией (и более точно воспроизвести приведенный пример), я временно удалил фреймы с этих страниц.
Добавление кода
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();
}
Ваш последний вопрос в комментариях довольно широкий: как отследить путь выполнения в цикле перенаправления формы? Я попробую.
Предположим, что у ваших авторизованных сценариев есть устройство обнаружения входа в систему, поэтому, если пользователь не вошел в систему, он будет перенаправлен в систему входа в систему:
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 на странице формы входа, чтобы убедиться, что скрытое поле заполнено правильно.
Других решений пока нет …