Почему мой заголовок PHP ('Location: ...') игнорирует HTTP-запрос GET? - PullRequest
0 голосов
/ 20 марта 2011

У меня есть 3 файла, account.php , index.php и browser.php .

После успешного входа в систему account.php вызывает следующую функцию:

header('Location: index.php?m='.base64_encode('Signed in'));

На что index.php звонит:

header('Location: ./browser.php?m='.$_GET['m']);

И browser.php отображает:

if(isset($_GET['m']))
    echo '<h3 style="color:green">'.base64_decode($_GET['m']).'</h3>';

Проблема в том, что заголовок ('Location: ...') вызывает index.php до browser.php удаляет что-либо после '?' . Каждый раз, когда URL отображает browser.php

Что происходит?


[EDIT]

Ну, проблема была исправлена ​​какой-то ужасной логикой if else в index.php. Выполнение следующих действий не работает (всегда запускается последний заголовок) :

if(isset($_GET['m']))
    header('Location: browser.php?m='.$_GET['m']);
if(isset($_GET['e']))
    header('Location: browser.php?e='.$_GET['e']);
header('Location: browser.php');

Мне пришлось перестроить его так:

if(isset($_GET['m']))
    header('Location: browser.php?m='.$_GET['m']);
else if(isset($_GET['e']))
    header('Location: browser.php?e='.$_GET['e']);
else
    header('Location: browser.php');

Но, честно говоря, все это не имеет значения, я должен использовать $ _SESSION для сохранения переменных в перенаправлениях. Спасибо всем!

Ответы [ 3 ]

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

Почему такая сложная структура?Почему бы не перенаправить из учетной записи непосредственно в браузер?

Несмотря на то, что браузеры чрезвычайно терпимы к синтаксису URL, он должен быть полностью определенным, начиная с http: //.Я сомневаюсь, что ./ может быть причиной, но почему бы вам не сделать это просто browser.php?

В любом случае, вам нужно отладить ваш код, чтобы определить актуальную проблему.

Прежде всего вы должны следить за фактическими отправляемыми HTTP-запросами.Firebug или LiveHTTPHeaders Дополнения Firefox могут сделать это.

Распечатывать все строки местоположения абсолютно необходимо.Просто замените поочередно все функции header () на echo () и посмотрите, какой фактический заголовок собирается отправить ваш код

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

1) Почему вы используете base64_encode, а не urlencode?

2) Location заголовок должен быть полным URL, включая протокол и имя сервера (если я правильно помню).

3) См. Комментарий Knittl.

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

Код, который вы показываете, безошибочный и должен работать. Проблема должна быть в другом месте. Можете ли вы проверить заголовки, используя Live HTTP Headers, Firebug или аналогичные, и посмотреть, что происходит? Я думаю, что ваша проблема в другом месте.

edit : В других ответах упоминается, что относительные URL не соответствуют стандартам. Это правда, но хотя RFC запрещают их, они работают (хотя я бы не писал ./browser.php, а просто browser.php).

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