Заголовок PHP (Расположение: ...): принудительное изменение URL в адресной строке - PullRequest
53 голосов
/ 19 сентября 2011

В настоящее время я работаю на мобильном сайте с аутентификацией с использованием PHP-сессий с базой данных. У меня есть страница входа с формой, которая отправляется на server_login.php при отправке. Затем php-файл создает некоторые данные сеанса (сохраняются в $ _SESSION) и перенаправляет пользователя обратно на страницу индекса:

header("location:../../index.php");

Новая веб-страница (index.php) загружается правильно; однако, когда заголовок перенаправляет страницу, URL в адресной строке не изменяется; он остается на уровне *http://localhost/php/server/server_login.php* вместо http://localhost/index.php, и поэтому все другие мои ресурсы, использующие относительный путь, не могут быть загружены. Как будто веб-страница все еще думает, что она находится в / php / server вместо /.

Как ни странно, мое другое использование заголовка ("location: ...") в logout.php работает и успешно перенаправляет страницу при изменении URL.

Я убедился, что в моем * server_login.php * нет никаких выходов до перенаправления заголовка (над ним просто вызовы mysql для проверки), и я также использовал ob_start () и ob_end_flush ().

Существуют ли какие-либо методы принудительного изменения URL-адреса в адресной строке (и, таким образом, можно ли решить проблему относительного пути)? Или я что-то не так делаю?

P / S: я использую jQuery Mobile.

РЕДАКТИРОВАТЬ: Вот мой код для перенаправления, которое не меняет URL:

// some other stuff not shown


$sql = "SELECT * FROM $user_table WHERE email = '$myemail' AND password = '$mypassword'";
$login_result = mysql_query($sql, $connection);

$count = mysql_num_rows($login_result);

if ($count == 1) {

    // Successfully verified login information

    session_start();

    if (!isset($_SESSION['is_logged_in'])) {
        $_SESSION['is_logged_in'] = 1;
    }

    if (!isset($_SESSION['email'])) {
        $_SESSION['email'] = $myemail;
    }
    if (!isset($_SESSION['password'])) {
        $_SESSION['password'] = $mypassword;
    }

    // Register user's name and ID
    if ((!isset($_SESSION['name'])) && (!isset($_SESSION['user_id'])))  {
        $row = mysql_fetch_assoc($login_result);
        $_SESSION['name'] = $row['name'];
        $_SESSION['user_id'] = $row['user_id'];
    }

    header("Location: http://localhost:8080/meet2eat/index.php");

} else {
    // Not logged in. Redirect back to login page
    header("Location: http://localhost:8080/meet2eat/php/login.php?err=1");

}

Ответы [ 14 ]

64 голосов
/ 21 апреля 2012

Попробуйте изменить:

header("Location : blabla")
                ^
                |
           (whitespace)

Для

header("Location: blabla")
30 голосов
/ 19 сентября 2011

Хорошо, если сервер отправляет правильный заголовок перенаправления, браузер перенаправляет и, следовательно, «меняет URL».Это может быть проблема браузера, тогда.Я не знаю, имеет ли это какое-либо отношение к этому, но вы не должны посылать относительный URL в заголовке местоположения («HTTP / 1.1 требует абсолютного URI в качестве аргумента» Местоположение: включая схему, имя хоста и абсолютный путь,но некоторые клиенты принимают относительные URI. ", http://php.net/manual/en/function.header.php), и" location "должны быть написаны заглавными буквами, например:

header('Location: http://myhost.com/mypage.php');
17 голосов
/ 03 мая 2013

В элементе формы добавьте data-ajax="false".У меня была такая же проблема с использованием мобильного jquery.

6 голосов
/ 26 февраля 2012

У меня была такая же проблема с отправкой формы. Я отключил data-ajax.

5 голосов
/ 03 декабря 2015

вы можете сделать перерыв; после вашего местоположения:

header("HTTP/1.1 301 Moved Permanently");
header('Location:  '.  $YourArrayName["YourURL"]  );
break;
5 голосов
/ 28 февраля 2014

Не используйте пробелы. Я была такая же проблема. Затем я удалил пустое пространство, как:

header("location:index.php"); or header('location:index.php');

Тогда это сработало.

1 голос
/ 15 августа 2016

Как предложил "cfphpflex", вы можете добавить break; после установки заголовка. Вы также можете повторить что-то, например, echo 'test';.

1 голос
/ 15 июня 2015

// Регистрация имени пользователя и идентификатора

if ((!isset($_SESSION['name'])) && (!isset($_SESSION['user_id'])))  {
    $row = mysql_fetch_assoc($login_result);
    $_SESSION['name'] = $row['name'];
    $_SESSION['user_id'] = $row['user_id'];
}

header("Location: http://localhost:8080/meet2eat/index.php");

изменить на

// Регистрация имени пользователя и идентификатора

if ((!isset($_SESSION['name'])) && (!isset($_SESSION['user_id'])))  {
    $row = mysql_fetch_assoc($login_result);
    $_SESSION['name'] = $row['name'];
    $_SESSION['user_id'] = $row['user_id'];
header("Location: http://localhost:8080/meet2eat/index.php");
}
1 голос
/ 21 июня 2014

Вы уверены, что на перенаправляемой странице тоже нет перенаправления, если данные сеанса не найдены? Это может быть вашей проблемой

Также да, всегда добавляйте пробелы, как предложено @Peter O.

0 голосов
/ 26 апреля 2015

Просто поменяй дом на свой вкус

$home_url = 'http://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['PHP_SELF']) . '/home';

header('Location: ' . $home_url);
...