[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Неясность с header(Location: )
Placido
Только недавно занялся изучение php. Помогите разобраться, пожалуйста.
Если я хочу перезапросить текущую страницу методом GET, то
могу это сделать, написав в коде:
header('Location: ' . $_SERVER['PHP_SELF']);
exit;

Вопрос вот в чем: почему, когда я пишу location вместе с адресом в виде переменной в двойных кавычках, -
header("Location: $_SERVER['PHP_SELF']");
exit;

- у меня возникает ошибка?
Ведь если я напишу, к примеру,
echo 'Location: ' . $_SERVER['PHP_SELF'];

и
echo "Location: $_SERVER['PHP_SELF']";
,
то получу один и тот же вывод на экран.
Вот сообщение об ошибке:
Цитата
Warning: include() [function.include]: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Helsinki' for '3.0/DST' instead in C:\Users\Public\Apache2.2\htdocs\index.php on line 12

Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in C:\Users\Public\Apache2.2\htdocs\index.php on line 12

Заранее спасибо.



Спустя 8 минут, 35 секунд (14.09.2011 - 15:06) inpost написал(а):
Placido
У тебя на другое ругается smile.gif Что на 12-ой строке

Спустя 2 минуты, 27 секунд (14.09.2011 - 15:08) caballero написал(а):
"Location: {$_SERVER['PHP_SELF']}";

Спустя 58 минут, 55 секунд (14.09.2011 - 16:07) Winston написал(а):
Цитата (Placido @ 14.09.2011 - 14:57)
Warning: include() [function.include]: It is not safe to rely on the system's timezone settings.

У тебя на include ругается.

Спустя 23 минуты, 24 секунды (14.09.2011 - 16:31) Placido написал(а):
Цитата (Winston @ 14.09.2011 - 13:07)
Цитата (Placido @ 14.09.2011 - 14:57)
Warning: include() [function.include]: It is not safe to rely on the system's timezone settings.

У тебя на include ругается.

Если написать "header('Location:' . $_SERVER['PHP_SELF']);", то все работает, и ни ошибок, ни ворнингов не возникает. А когда в двойных кавычках - проблем.

Не пойму, почему нельзя написать "Location: $_SERVER['PHP_SELF']"? Ведь, PHP, по идее, должен обрабатывать все, что стоит внутри двойных кавычек и подставлять значение. Или я понимаю неправильно?


Спустя 4 минуты, 59 секунд (14.09.2011 - 16:36) Winston написал(а):
header - это функция которая отправляет заголовок. И до ее объявления не должно быть никакого вывода !

Спустя 18 минут, 5 секунд (14.09.2011 - 16:54) Placido написал(а):
Цитата (Winston @ 14.09.2011 - 13:36)
header - это функция которая отправляет заголовок. И до ее объявления не должно быть никакого вывода !


Вывода и не было, проблема была в другом. Только что понял. $_SERVER['PHP_SELF'] - это не переменная, а элемент массива, и в строке его необходимо выделять фигурными скобками, как подсказал caballero.

Всем спасибо.

Спустя 2 минуты (14.09.2011 - 16:56) inpost написал(а):
Placido
И вообще, так: header("Location: $_SERVER['PHP_SELF']"); - неправильно! header("Location: " . $_SERVER['PHP_SELF']); - так правильно

Спустя 1 минута, 42 секунды (14.09.2011 - 16:57) inpost написал(а):
Фигурные скобки - это синоним: ".$var.".
Строчки идентичны:
echo "lala".$var;
echo "lala{$var}";

Спустя 21 минута, 7 секунд (14.09.2011 - 17:19) twin написал(а):
Если совсем правильно, то нужно полный путь указывать.

Спустя 2 минуты, 4 секунды (14.09.2011 - 17:21) inpost написал(а):
twin
В зависимости от сервера и как указан путь, то будет разный редирект (внутренний или внешний). smile.gif

Спустя 2 часа, 34 минуты, 33 секунды (14.09.2011 - 19:55) crash написал(а):
а почему не сделать так, как написал caballero?
Ведь обращение к переменным массива и свойствам объектов всегда берется в фигурные скобки в двойных кавычках.

Спустя 1 час, 23 минуты, 6 секунд (14.09.2011 - 21:18) twin написал(а):
Цитата (inpost @ 14.09.2011 - 14:21)
twin
В зависимости от сервера и как указан путь, то будет разный редирект (внутренний или внешний). smile.gif

По RFC путь должен быть полным. Вместе с протоколом. httр://и_так_далее.
Не важно, внутренний он или внешний.

Спустя 19 минут, 31 секунда (14.09.2011 - 21:38) Placido написал(а):
Цитата (twin @ 14.09.2011 - 18:18)
По RFC путь должен быть полным. Вместе с протоколом. httр://и_так_далее.

А где об этом можно почитать?

Спустя 2 минуты, 3 секунды (14.09.2011 - 21:40) twin написал(а):
В RFC )))

Спустя 36 минут, 38 секунд (14.09.2011 - 22:16) inpost написал(а):
twin
Котеров писал, что если полный делать редирект, то он всегда будет проходить через клиента. Если внутренний, то этот редирект пройдет на стороне сервера, и клиент в своём браузере даже не узнает, что был редирект, даже с отключенными в браузере редиректами. У меня на тот момент не было сайта на cgi под рукой. поэтому проверить лично не смог...

Спустя 10 часов, 24 минуты, 7 секунд (15.09.2011 - 08:41) twin написал(а):
Мне плохо верится, что это мог написать Котеров... Может ты со своим любимым Поповом спутал?)))

Как может редирект пройти на стороне сервера? В браузере отобразилась новая страница, а он ничего не узнал об этом?

Функция header() отправляет заголовки, не более того. Браузер уже решает, что ему делать с этими заголовками.
header('location: /');
равносилен такой ссылке
<a href="/">Ссыль</a>
что вполне допустимо в ссылках. Но если следовать букве закона, в заголовке должен указываться полный путь вместе с протоколом. И хотя браузеры сами умеют подставлять дефолтный путь, закон есть закон.

Спустя 7 часов, 23 минуты, 4 секунды (15.09.2011 - 16:04) inpost написал(а):
twin
Если хочешь, могу даже найти тебе эти строчки, и да, это он написал в своём втором издании smile.gif

Спустя 1 час, 30 минут, 24 секунды (15.09.2011 - 17:34) twin написал(а):
Ну конь о четырех ногах и тоже спотыкается. Или может ты чего не так понял. Найди, если не трудно

Спустя 2 часа, 54 минуты, 2 секунды (15.09.2011 - 20:28) inpost написал(а):
Так-с, ты хочешь сказать, что кто-то из нас троих конь?! smile.gif
Дополнение: ну вот, нашел, как раз то, что я рассказывал, в начале первого файла говорится про внешний редирект, там как раз лишь отрывок с PHP. Как вижу, тут сказано, что браузер не получает информации о редиректе, и поэтому даже если отключить "автоматический редирект при запросе", то браузер этого не заметит. Смотри сам, жду твоего мнения по этому вопросу. Я лишь читал, сам даже не пробовал такое:

http://my.jetscreenshot.com/7950/20110915-fcuk-194kb
http://my.jetscreenshot.com/7950/20110915-qodz-166kb

Спустя 1 час, 13 минут, 31 секунда (15.09.2011 - 21:42) twin написал(а):
Посыпаю голову пеплом. Поищу на досуге RFC, где видел это. Но наверно так и есть.

Спустя 4 минуты, 44 секунды (15.09.2011 - 21:46) inpost написал(а):
twin
Единственное, что непонятно, что будет оставаться в адресной строке, страницу предоставлять ту, куда был редирект, несмотря на то, что браузер думает, что ты до сих пор на первой странице...

Спустя 42 минуты, 55 секунд (15.09.2011 - 22:29) twin написал(а):
Браузер ничего не думает. Какой заголовок ему прислали, то и покажет. Тут вопрос только в нескольких последовательных редиректах в пределах одного сайта. Таки да, инфа о промежуточных редиректах в поток похоже не выйдет. Но заголовок последнего редиректа все равно отправится прямиком клиенту. С кодом 302 или 303.

Так что в принципе разницы нет, если редирект один. Что полный путь поставишь, что местный. И скорее всего RFC регламентирует нормальные редиректы, так как додуматься до нескольких штук подряд в пределах одного сайта... ну как минимум странно.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.