Попытка понять шаблон дизайна 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 имеет значение, но это так. Так что, по крайней мере, моя непосредственная проблема решена.

Большое спасибо всем, кто прокомментировал!

Ура, Мэтт Стюлер

Ответы на вопрос(2)

Ваш ответ на вопрос