Я хочу отправить своих пользователей в различные страницы на основе пользовательского действия. Таким образом, я сделал несколько функций в верхней части страницы как так:
<?php
function one() {
header("location: pagea.php");
}
function two() {
header("location: pageb.php");
}
function three() {
header("location: pagec.php");
}
?>
Конечно, я получаю ошибку, потому что я - заголовки объявления ре. Сначала я, хотя это было хорошо, так как я содержу их в функциях и вызываю любую функцию за один раз. Но тем не менее я получаю ошибку. Есть ли какой-либо другой способ сделать это?
Я думаю, вы неправильно понимаете, что делает HTTP-заголовок Местоположение
.
Заголовок Location
инструктирует клиента перейти на другую страницу. Вы не можете отправить больше одного заголовка Location
на страницу.
Кроме того, PHP отправляет заголовки прямо перед первым выводом. После вывода вы не можете указать больше заголовков (если вы не используете буферизацию вывода).
Если вы укажете один и тот же заголовок дважды, по умолчанию header ()
заменит предыдущее значение последним ... Например:
<?php
header('Location: a.php');
header('Location: b.php');
header('Location: c.php');
перенаправит пользователя на c .php
, ни разу не проходя через a.php
или b.php
.Вы можете изменить это поведение, передав значение false
второму параметру (называемому $ replace
):
<?php
header('X-Powered-By: MyFrameWork', false);
header('X-Powered-By: MyFrameWork Plugin', false);
Заголовок Location
можно указать только один раз. Отправка нескольких заголовков Location
не будет перенаправлять пользователей на страницы ... Это, вероятно, запутает хрень из UA. Также имейте в виду, что код продолжает выполняться после отправки заголовка Location
. Поэтому следуйте за этим вызовом header ()
с exit
. Вот правильная функция перенаправления:
function redirect($page) {
header('Location: ' . $page);
exit;
}
Вы получаете эту ошибку, потому что ваш сценарий уже произвел вывод (вы использовали echo / print перед вызовом header ()). Вам нужно вызвать header () до того, как ваш скрипт выдаст какой-либо вывод.
http://php.net/manual/en/function.header.php
Помните, что header () должен вызываться перед отправкой любого фактического вывода , либо обычные HTML-теги, пустые строки в файле или из PHP. Очень распространенная ошибка - читать код с помощью include () или require (), функций или другой функции доступа к файлам, а также иметь пробелы или пустые строки, которые выводятся до вызова header (). Та же проблема существует при использовании одного файла PHP / HTML.
Вы получите следующую ошибку при попытке вызвать header () после отправки любого вывода ...
Предупреждение: невозможно изменить информацию заголовка - заголовки уже отправлены
Попробуйте что-то вроде этого:
<?php
$page = // use an if statement or whatever you need to figure out
//which page you need (pagea.php, etc.)
fnx($page)
function fnx($page) {
header("location: " . $page);
}
?>
или
<?php
$page = // use an if statement or whatever you need to figure out
//which page you need (pagea.php, etc.)
header("location: " . $page);
?>
Вот как я делаю, когда мне нужно отправить несколько заголовков:
$headers = array(
'Location' => 'http://www.stackoverflow.com',
'Content-Type' => ' application/pdf',
);
foreach ($headers as $headerType => $headerValue)
{
header($headerType . ': ' . $headerValue);
}
Используйте headers_sent(), чтобы проверить, сможете ли вы отправить заголовки или нет.
Либо они не все в функциях, либо вызывается более одного.
function one() {
return "location: pagea.php";
}
function two() {
return "location: pageb.php";
}
function three() {
return "location: pagec.php";
}
header(one()); // for example
Может быть, что-то в этом роде?