Как мы знаем, функция header()
в PHP вызывает ошибки, если они не отправлены перед содержимым HTML, поэтому вместо использования буферизации вывода или, что еще хуже, подавления известных ошибок «заголовки уже отправлены», я думал об использовании содержимого HTML перенаправлять как альтернативу. например:
if($userRegister){ ?> <meta http-equiv="refresh" content="0; URL=success.php" /> <?php }
Поскольку я не видел такого подхода, я хотел бы знать, что мне что-то не хватает. Поскольку это выглядит неплохим подходом для перенаправления страниц
см.: Является ли хорошей практикой использовать теги meta refresh для перенаправления вместо функции header () в php?
оба метода имеют свои взлеты и падения.
по-моему, лучше использовать header()
поскольку он отправляет меньшую полезную нагрузку клиенту и не будет вызывать побочные эффекты из браузера, загружая DOM другой страницы.
Это не требуется, но я бы предложил сделать что-то вроде этого:
if($userRegister){ ?> <script type="text/javascript">location.href="success.php";</script> <noscript><meta http-equiv="refresh" content="0; URL=success.php" /></noscript> <?php }
Вы использовали мета-обновление в качестве альтернативы местоположению заголовка. Это правильно, но, на мой взгляд, вы должны использовать перенаправление заголовка, и если вы хотите удалить header already sent
ошибку, вы должны использовать ob_start()
и ob_flush()
и включить вывод, буферизирующий ваш php.ini, если он выключен.
я лично использовал headers_sent
вместо проверки определенной переменной, так как именно поэтому функция была создана в первую очередь
if (headers_sent()) { echo '<meta http-equiv="refresh" content="0; URL=success.php" />' }
Я также предлагаю создать метод перенаправления, поэтому вам не нужно каждый раз тестировать заголовки в разных частях кода.
function redirect($target) { if (headers_sent()) { echo "<meta http-equiv=\"refresh\" content=\"0; URL={$target}\" />"; } else { header("Location: {$target}"); } exit; }