пятница, 25 августа 2017 г.

Редирект в php при уже заданных заголовках.


Часто в процессе разработки сайта бывает необходимо сделать редирект на какаю-нибудь страницу. Это потребность может возникать как перед выводом html кода на страницу, так и в середине страницы и в конце.

Для редиректа в php используется функция header — эта функция создает заголовок для страницы. И чтобы сделать переход на другую страницу в заголовке указывается следующее «Location: http://site.com», а все вместе получается вот так:

header("Location: http://site.com");

Это хорошо работает пока находится до того, как в html уже были созданы заголовки. В случае, когда вы попробуете выполнить данный код, после вывода на страницу тегов вы будите не приятно удивлены увидев следующий текст предупреждения от php:
Warning: Cannot modify header information — headers already sent by
Помимо предупреждения еще и не сработает редирект. Почему? Все очень просто, вы пытаетесь создать заголовок после того, как его ужа задали, только с помощью html тегов .
Эту проблему можно решить, для этого необходимо использовать буферизацию. Для этого пригодятся функции ob_start() и ob_end_flush(). При включенной буферизации все ни чего не выводится, все будет писаться в буфер, вывод осуществится после выключения буферизации. Функция ob_start — включает буферизацию, значит ее нужно вызвать перед тегами . А в конце страницы необходимо вызвать функцию ob_end_flush() она выключит буферизацию и сделает вывод всего, что хранится в буфере.
Как я уже говорил при буферизации ни чего не выводится, кроме того, что задано с помощью функции header, таким образом, можно без проблем делать редирект, вызвав header(«Location: http://site.com»); в любом месте страницы.
Для наглядности приведу пример кода:

<?php ob_start(); ?>
<!DOCTYPE HTML>
<html>
    <head>
        <title>SITE NAME</title>
        <meta charset="utf-8" />
    </head>
<body>
    <h1>TITLE</h1>
    <?php header("Location: http://site.com"); ?>
</body>
</html>
<?php ob_end_flush(); ?>

Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html