PHP сессия не работает в Safari, Webkit Nightly - PullRequest
5 голосов
/ 20 февраля 2011

У моего сайта есть индексная страница, и эта страница проверяет, установлен ли для php-сессии:

session_start();

$name = $_SESSION["name"];

if (!$name) {
  header('Location: name.php');
}

name.php имеет простую форму для установки имени (без php) с действиемиз setName.php.setName.php:

session_start();

$_SESSION["name"] = $_POST["name"];

header('Location: index.php');

В любом браузере, кроме safari (и Webkit Nightly), пользователь задает свое имя и возвращается к индексу.Однако в S (& WN) отправка формы имени возвращается на ту же страницу.

Файлы cookie включены для всех сайтов, и устанавливается идентификатор сеанса: enter image description here

Редактировать:В случае, если это что-то меняет, мой сервер - это macbook, на котором работает MAMP с php 5.3.

Если вы хотите попробовать это самостоятельно, URL-адрес 121.73.150.105/questions, но он часто отключен.

Ответы [ 7 ]

3 голосов
/ 26 февраля 2011

Это может быть не причиной ваших проблем, но вот что говорит руководство PHP о «Location»:

HTTP / 1.1 требует абсолютного URI в качестве аргумента для »Location: включаясхема, имя хоста и абсолютный путь, но некоторые клиенты принимают относительные URI.

Руководство по PHP

0 голосов
/ 22 марта 2011

В каждом браузере, кроме сафари (и Webkit Nightly), пользователь задает свое имя и возвращается в индекс.Однако в S (& WN) Отправка формы имени возвращается на ту же страницу.

Возможно, это не ваш PHP, а только HTML вашей формы.Не могли бы вы опубликовать это здесь?

0 голосов
/ 20 марта 2011

для вашего местоположения вместо "header ('Location: name.php');"попробуйте использовать полный адрес местоположения, например: 'Location: http: //...name.php', обязательно включите http: //...ect частьвеб-адрес.

0 голосов
/ 09 марта 2011

попробуй:

if (!$name) {
  session_write_close();
  header('Location: name.php');
}
0 голосов
/ 09 марта 2011

Звучит как проблема с файлом cookie PHPSESSID.
Для форм, ссылок и фреймов это решается механизмом восстановления php: url_rewriter.tags .

Однако для http-заголовков (Location :) это необходимо сделать вручную.

header('Location: name.php?'.htmlspecialchars(SID));

Где константа SID php в основном равна session_name().'='.session_id()
Для получения дополнительной информации см. Справочную страницу "PHP: передача идентификатора сеанса" .

Это не только исправляет ошибку webkit, но и заставляет ваш сайт работать в других браузерах, когда cookie отключены.

Не передавая session_id в заголовок (), сайт использует куки, поэтому ini.session.use-cookies = 0 (как указано в комментариях) заставляет все браузеры перестать работать.

0 голосов
/ 24 февраля 2011

@ JJ56, вот код, который у меня был, который работал, когда вы его пробовали.

index.php

<?php 

session_start();

$name = $_SESSION["name"];

if (!$name) {
  exit(header('Location: name.php'));
}

echo "Name is $name.";

?>

name.php

<!doctype html>
<html>
  <head>
    <title>Questions Test</title>
  </head>
  <body>
    <form method="post" action="setName.php">
      <input type="text" name="name">
      <input type="submit" name="submit">
    </form>
  </body>
<html>

setName.php

<?php 

session_start();

$_SESSION["name"] = $_POST["name"];

header('Location: index.php');

?>
0 голосов
/ 21 февраля 2011

вместо: header('Location: index.php');

попробуйте это: header('Location: index.php'); exit();

После отправки заголовка местоположения, PHP продолжит синтаксический анализ, все равно выполнит остальную часть страницы.Это может означать, что ваши данные $ _SESSION не будут сохранены к тому времени, когда вам это нужно.Принудительный выход должен исправить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...