2011-01-11 2 views
0

Опять же, крайне нужный вопрос PHP.Что случилось с тем, как я перенаправляю между двумя страницами?

У меня есть очень простой Войти страница

<?php 
    session_start(); 
    if (isset($_SESSION['username'])) 
    { 
    header('Location: main.php'); 
    exit(); 
    } 
    if (isset($_POST['submit'])) 
    { 
    $user = $_POST['user']; 
    $pass = $_POST['pass']; 
    if (try_login($user,$pass)) 
    { 
     $_SESSION['username'] = $user; 
     header('Location: main.php'); 
     exit(); 
    } 
    } 
?> 
<html> <!-- and login form below... > 

, а также очень простой главную страницу:

<?php 
    session_start(); 
    if (!isset($_SESSION['username'])) 
    { 
    header('Location: .'); 
    exit(); 
    } 
?> 
<html> <!-- etc, etc --> 

Я ожидаю, что следующие вещи происходят:

  1. Если я навигации до http://localhost/main.php перед входом в систему, я должен быть перенаправлен на http://localhost/.
  2. Если я перейду к http://localhost/ и зарегистрируйтесь успешно, я должен быть перенаправлен на http://localhost/.

К сожалению, № 2 не существует. Что может быть неправильным с моим кодом?

+1

Уверен, у вас есть опечатка в №2. В противном случае это не имело бы смысла. – nico

+0

Это была не опечатка. Я думал, это сработает. Теперь я изменил перенаправление на 'header ('Location: /')'. – pyon

ответ

2

Вы можете быть запущены в состояние гонки здесь. Я сталкивался с ним несколько раз ... вы задали некоторые вещи в сеансе, но на следующей странице этого не видно. Обычно это вызвано тем, что браузер запрашивает вторую страницу так быстро, что первый не успел написать сеанс, поэтому второй не видит изменений в переменных сеанса.

Попробуйте позвонить session_write_close(), прежде чем отправлять свой заголовок перенаправления.

2

Вы должны использовать абсолютные URI, такие как Location: / или Location: /main.php.

+0

Вау, большое спасибо! – pyon

+1

Хотя настоятельно рекомендуется сделать имя абсолютным (и несколько браузеров захлебнутся, если это не так), «must» завышает немного. Многие браузеры будут обрабатывать относительные перенаправления. Включая большинство общих. – cHao

+0

Ты абсолютно прав. Спасибо, что указали на эту деталь. Важно то, что 'Местоположение:.' Определенно не будет работать. – scoffey

3

Вы должны использовать полный URL:

header('Location: http://localhost/main.php '); 
+1

+1 для обозначения того, что он должен быть полностью квалифицированным. –

+2

Это вводит в заблуждение: нет необходимости включать полное доменное имя (полное доменное имя). Жесткое кодирование имени хоста является досадой при наличии веб-сервера, настроенного виртуальными хостами, или развертывания webapp на другом хосте. Тем не менее, полный URL * * необходим для перенаправления на внешние сайты. – scoffey

+0

Вот что говорит RFC http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.30 – Osw

0
<?php 
    session_start(); 
    if (isset($_SESSION['username'])) 
    { 
    header('Location: main.php'); 
    exit(); 
    } 

Как должно регистрироваться? Вы перенаправляете, если в $ _SESSION нет установленного имени пользователя . ДО вы делаете какой-либо код, который фактически установил бы эту переменную. Это делает код входа в систему недоступным.

+0

@Mark: '$ _SESSION ['username']' может быть уже установлен, потому что пользователь перешел на ' http: // localhost/'перед выходом из системы. Вместо того, чтобы снова отображать форму входа в систему, я хочу перенаправить пользователя на главную страницу. – pyon

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