Предположим, я хочу перейти на страницу контактов. Но для того, чтобы попасть туда, сайт требует от меня входа в систему. После входа в систему я должен быть перенаправлен на страницу контактов, но я где-то еще. Что мне делать, чтобы мне пришлось перенаправить на страницу, которую я хочу после входа?
У меня есть сильное чувство, что это имеет какое-то отношение к занятиям, но тем не менее. Каким должен быть подход?
У вас есть три общих подхода:
(1) выглядит примерно так:
<?php session_start(); if (!$_SESSION['userid']) { $_SESSION['page'] = '/contact'; header('Location: /login'); exit; } ... ?>
При успешном входе в систему загрузите $_SESSION['page']
и перенаправьте.
(2) аналогичен, за исключением того, что нет переменной сеанса. Вместо этого у вас есть:
header('Location: /login?return=/contact');
для передачи перенаправления. Страница входа в систему должна включать его как скрытое поле формы на странице, которое представляет пользователю запрос на имя пользователя и пароль.
(3) аналогичен, но не перенаправляется на отдельную страницу. Вместо этого каждая страница потенциально может быть страницей входа в систему. Если пользователь не зарегистрирован в форме входа в систему, вместо него. URL-адрес по-прежнему будет «/ contact». Каждая страница будет обнаруживать и обрабатывать попытки входа в систему.
Преимущество этого метода заключается в том, что он меньше внешнего перенаправления, и обрабатывать представленные формы проще. Под этим я подразумеваю, что представьте, что кто-то заполняет форму на одной из ваших страниц, а затем нажимает кнопку submit. Система видит, что их логин истекло. Если вы перенаправляете пользователя на новую страницу и затем перенаправляете обратно, им, вероятно, потребуется повторно ввести все поля формы. Если вы будете обрабатывать логин неявно, вы можете включить все поля формы в виде скрытых вводов и после того, как вы вошли в систему без проблем, рассматриваете его как отправку исходной страницы.
Подход, который я обычно использую:
$_SERVER['HTTP_REFERER']
(которая будет установлена на страницу, с которой пользователь пришел, т.е. на странице контактов), и сохраните это как скрытое поле. Красота заключается в том, что он автоматически работает для всех страниц, для которых требуется вход в систему, без необходимости устанавливать переменные сеанса на каждой странице.
Одно предупреждение: при входе в систему вы должны проверить, что страница в реферере находится на вашем сайте, а не совсем другой сайт, например, если пользователь пришел из Google.
Я имею тенденцию перенаправлять на страницу входа, передавая текущий URL-адрес в строке запроса.
Страница для защиты
session_start(); if (!isset($_SESSION['user_id'])) { // Fetch current URL $this_url = $_SERVER['REQUEST_URI']; // Redirect to login page passing current URL header('Location: login.php?return_url=' . urlencode($this_url)); exit; } // Continue processing echo 'Hello from this page';
Страница входа
session_start(); // Simulate logging in user $_SESSION['user_id'] = 1; // Fetch URL to redirect to $return_url = isset($_GET['return_url']) ? $_GET['return_url'] : 'site_home.php'; // Redirect back header('Location: ' . $return_url);
В приведенном выше коде я просто имитирую процесс входа в систему. Обычно пользователь должен отправлять свои учетные данные через форму, учетные данные проверяются, а затем пользователь регистрируется. URL-адрес страницы для перенаправления обратно должен поддерживаться через этот обработать. Вы можете либо продолжать передавать URL-адрес в строке запроса, либо через скрытое поле ввода в форме.