Как объявить более одного заголовка на PHP

Я хочу отправить своих пользователей на разные страницы в зависимости от действий пользователя. Поэтому я сделал несколько функций в верхней части страницы:

<?php function one() { header("location: pagea.php"); } function two() { header("location: pageb.php"); } function three() { header("location: pagec.php"); } ?> 

Конечно, я получаю сообщение об ошибке, потому что я объявляю заголовки. Сначала я, хотя все будет хорошо, потому что я их содержу внутри функций и одновременно вызываю любую функцию. Но все же я получаю ошибку. Есть ли другой способ сделать это?

Я думаю, вы неправильно поняли, что делает HTTP-заголовок.

Заголовок Location указывает клиенту перейти на другую страницу. Вы не можете отправить больше одного заголовка Location на страницу.

Кроме того, PHP отправляет заголовки непосредственно перед первым выходом. После вывода вы не можете указать больше заголовков (если вы не используете Output Buffering).

Если вы дважды укажете один и тот же заголовок, по умолчанию 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 не приведет к перенаправлению пользователей на страницы … Вероятно, это путает дерьмо из UA. Кроме того, поймите, что код продолжает выполняться после отправки заголовка Location . Итак, следуйте этому вызову header() с exit . Вот правильная функция перенаправления:

 function redirect($page) { header('Location: ' . $page); exit; } 

Либо они не все в функциях, либо вызывается более одного.

Попробуйте что-то вроде этого:

 <?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); ?> 

Вы получаете эту ошибку, потому что ваш скрипт уже выпустил результат (вы использовали echo / print перед вызовом header ()). Вам нужно вызвать header (), прежде чем ваш скрипт выдает какой-либо вывод.

Из руководства по PHP

http://php.net/manual/en/function.header.php

Помните, что header () должен быть вызван до отправки любого фактического результата либо с помощью обычных тегов HTML, пустых строк в файле, либо из PHP. Очень распространенная ошибка для чтения кода с функциями include () или require (), функций или другой функции доступа к файлам, а также пробелы или пустые строки, которые выводятся перед вызовом header (). Та же проблема существует при использовании одного файла PHP / HTML.

При попытке вызвать header () после отправки любого результата вы получите следующую ошибку …

Предупреждение: невозможно изменить информацию заголовка – уже отправленные заголовки

Вот как мне нравится делать, когда мне нужно отправить несколько заголовков:

 $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 

Может, что-то в этом роде?

Вы можете попробовать что-то подобное.

 <?php function one() { $redirect=pagea.".".php; } function two() { $redirect=pageb.".".php; } function three() { $redirect=pagec.".".php; } header("location:".$redirect); ?> 

Ради людей, которые могут приехать сюда из Google, если вы заинтересованы в том, чтобы иметь несколько одинаковых заголовков:

Технически возможно иметь несколько заголовков того же типа, которые передаются в PHP. header имеет параметр «replace». Из документации:

Необязательный параметр replace указывает, должен ли заголовок заменить предыдущий аналогичный заголовок или добавить второй заголовок того же типа. По умолчанию он будет заменен, но если вы передадите FALSE в качестве второго аргумента, вы можете заставить несколько заголовков одного типа.

Поэтому вы должны иметь возможность написать:

 header("location: pagea.php"); #You want to overwrite the initial one, so you'd have this one be default, or true header("location: pageb.php",false); header("location: pagec.php",false); 

Конечно, если ваш тип заголовка не может быть несколько раз, вы получите сообщение об ошибке. В этом случае вы получите эту ошибку (написана так в Chrome):

Эта страница не работает

localhost отправил неверный ответ.

ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION

Однако для других заголовков этот метод должен работать нормально. Пример, который они представляют:

 header('WWW-Authenticate: Negotiate'); header('WWW-Authenticate: NTLM', false);