Попытка понять шаблон дизайна Post / Redirect / Get (реализован на PHP)
Все,
Извините заранее - я не эксперт по PHP и не разбираюсь в шаблонах проектирования, поэтому этот вопрос может быть немного базовым ...
Во всяком случае, я работаю над веб-приложением, которое потребует входа в систему.
Мой план состоит в том, чтобы иметь что-то вроде этого:
index.php: эта страница будет содержать простую форму, которая позволяет пользователям вводить имя пользователя и пароль. Форма будет отправлять входы в ...
login.php: эта страница будет получать входные данные из index.php и проверять эти учетные данные в базе данных. Если какой-либо из входных данных отсутствует или проверка учетных данных завершается неудачно, скрипт phpREDIRECT пользователь вернулся в index.php, используя:
header('Location: http://www.mydomain.com/index.php');
Если учетные данные действительны, то login.php создает сеанс для установления статуса аутентифицированного пользователя:
session_start();
$_SESSION['authenticated'] = true;
Затем он определяет, какой тип доступа имеет пользователь. Если у него есть доступ «уровня 1», скрипт перенаправит пользователя на level1.php, используя:
header('Location: http://www.mydomain.com/level1.php');
Если у пользователя есть доступ «уровня 2», сценарий перенаправит пользователя на level2.php, используя:
header('Location: http://www.mydomain.com/level2.php');
Наконец, когда достигается level1.php или level2.php, первое, что они делают, это проверяют сеанс. Если пользователь не аутентифицирован, перенаправьте его обратно на index.php:
session_start();
if (!isset($_SESSION['authenticated']) {
header('Location: http://www.mydomain.com/index.php');
} else {
// proceed to display the page
}
Наличие этой проверки в level1.php и level2.php предотвратит прямой доступ пользователей к этой странице без входа в систему.
Моя первая проблема заключается в следующем: эта простая логика терпит неудачу в первый раз - когда достигается level1.php, "isset ($ _ SESSION ['authenticated']"ВСЕГДА возвращает false, поэтому пользователь всегда перенаправляется обратно в index.php. Если он вводит те же самые учетные данные во второй раз, процесс работает как надо.
Короче говоря, по причинам, которые я не понимаю, кажется, что сессия, установленная login.php, не найдена level1.php - я полагаю, из-за перенаправления. Другими словами, проверка на level1.php, по-видимому, завершится неудачей до тех пор, пока / или не будет выполнен возврат в браузер клиента
Поскольку каждый сайт, требующий входа в систему, уже решил эту проблему, это не должно быть новым испытанием, и для них это должно быть очень устоявшимся образцом. Как мне справиться с этим?
Смежный вопрос ... Я видел подобные вопросы, заданные здесь ранее, и большинство ответов обычно включают решение, при котором страницы возвращаются к себе. Это кажется немного странным - в идеале, я бы хотел, чтобы каждая страница PHP выполняла определенную работу:
index.php - отобразить форму для сбора учетных данных, а затем опубликовать их в login.phplogin.php - оцените учетные данные пользователя, затем направьте их на соответствующую страницуlevel1.php & level2.php - отображать соответствующий контентЭто некорректная установка? Если так, что лучше?
И вообще - если одна страница устанавливает сеанс, а затем перенаправляет пользователя на другую страницу - есть ли способ, чтобы вторая страница могла прочитать сеанс?
В Википедии есть отличная страница о Post / Redirect / Get:
http://en.wikipedia.org/wiki/Post/Redirect/Get
Но это немного концептуально для меня - мне бы хотелось, чтобы это объяснялось ссылками на конкретные страницы:
Например. форма на «странице A» отправляет данные на «страницу B», «страница B» перенаправляет пользователя на «страницу C» и т. д.
И я не понимаю, как это реализовано в сеансах, если сеансы не распознаются при использовании перенаправлений.
Заранее большое спасибо за любые советы и идеи.
[ОБНОВИТЬ]
Благодаря комментарию Мэтта Болла я исправил проблему:
login.php настраивал сессию и перенаправлял пользователя на следующий экран:
session_start();
$_SESSION['authenticated'] = true;
header('Location: http://www.mydomain.com/level1.php');
Однако, когда level1.php проверил этот сеанс, «аутентифицированный» былНЕ УСТАНОВЛЕН:
session_start();
echo (isset($_SESSION['authenticated']); // returns false
Однако, если я изменил login.php, чтобы заголовок перенаправлялся наРОДСТВЕННИК URL вместо абсолютного:
session_start();
$_SESSION['authenticated'] = true;
header('Location: level1.php');
Тогда level1.php работает так, как я ожидал:
session_start();
echo (isset($_SESSION['authenticated']); // now returns true
Я не понимаю, почему относительный URL имеет значение, но это так. Так что, по крайней мере, моя непосредственная проблема решена.
Большое спасибо всем, кто прокомментировал!
Ура, Мэтт Стюлер