Общение WEB-сервера с клиентом в данном случае происходит по протоколу HTTP. HTTP включает в себя HTTP заголовки и тело ответа. При этом заголовки обязательно следуют перед телом ответа – того требует стандарт.
PHP же в свою очередь в процессе работы должен сформировать и заголовки и тело ответа. Даже если Вы не задаете ни одного заголовка, то PHP сам устанавливает все необходимые заголовки для ответа клиенту. При этом данные, которые необходимо отдать клиенту он записывает сначала в буфер, но если он начал писать в буфер тело ответа, то заголовки он уже никак не может туда записать и встретив попытку записи заголовков ответа уже после того, как начало формироваться тело ответа PHP выдает ошибку:
Warning: Cannot modify header information - headers already sent by (output started at ...
Это может быть следствием следующих причин:
-
Перед установкой заголовков был вывод тела ответа. При этом вывод может быть осуществлен как средствами шаблонизатора, так и через функции echo или print
<html> // вывод средствами шаблонизатора <?php echo "<body>"; // вывод средствами оператора header( "Content-Type: text/html; charset=utf-8" );
-
Вы можете банально ошибиться и поставить перед
<?
пробелы или переносы строк, которые тоже будут восприняты как тело ответа. -
Ровно так же как и в пункте 2, но в конце php-файла:
Файл incrementX.php<?php $x++; ?>[пробел][перенос строки]
Файл index.php
<?php include( "incrementX.php" ); header( ... );
-
Файлы, которые содержат PHP-код должны быть сохранены без BOM. Как сохранить файл без BOM.
-
Не забывайте, что если Вы подключаете файлы через include или require, то файлы к которым обращаются эти функции также могут содержать одну из трех вышеперечисленных проблем.
include( "include.inc" ); // include.inc может формировать тело ответа header( ... );
-
Если настроен вывод ошибок в браузер, то warning тоже будет телом ответа:
$filename= ""; $text= file_get_contents( $filename ); // Warning: file_get_contents(): Filename cannot be empty header( ... );
Самым правильным решением большинства проблем с выводом заголовков является изменение структуры РНР файла таким образом, чтобы весь вывод начинался только после того, как отработала основная логика скрипта.
Если же приходится работать с устаревшим кодом где всё вперемешку, можно воспользоваться буферизацией вывода явным образом:
<? ob_start();?>
<html>
<?php
echo "<body>";
header("Content-Type: text/html; charset=utf-8");
ob_end_flush();
либо настройками php.ini принудить PHP сперва наполнять буфер данными до определенного размера, и лишь потом отдавать содержимое буфера клиенту, но в этом случае превысив размер буфера Вы увидите Выше описываемую ошибку.
output_buffering = 14096
Ошибка «Невозможно изменить информацию заголовка» означает, что вы правили файлы (скорее всего, wp-config.php) вручную. И правили некорректно. Необходимо сохранять файлы в кодировке UTF-8 без метки BOM (byte order mark).
Имя файла, приводящего к ошибке, и номер строки указаны в «output started at». Например:
Warning: Cannot modify header information — headers already sent by (output started at /home/user/site.ru/public_html/wp-config.php:1) in /home/user/site.ru/public_html/wp-includes/pluggable.php on line 934
означает, что проблему вызывает 1-я строка файла wp-config.php.
- Убедитесь, что перед первой строкой <?php и после последней ?> нет пустых строк.
- Избегайте править файлы в Блокноте. Используйте «программистские» редакторы вроде PSpad, Notepad++ и им подобные, в которых метка BOM отключается. В Notepad++ для этого нужно выбрать в меню «Кодировки» пункт «Преобразовать в UTF-8 без BOM».
Также к предупреждению Cannot modify header information приводит вывод любых других сообщений об ошибках, предупреждений и нотаций php, предшествующих выводу заголовков.
« Вернуться к ЧАВО
Most WordPress error messages give you an idea of what’s causing problems on your site. The “Warning: cannot modify header information – headers already sent by” error is no exception. If a PHP file cannot be executed due to a problem in its code, you’ll run into this message.
There are several potential causes for the “Cannot modify header information” error. Fortunately, the message itself will tell you which file is causing the problem. It even points to the line of code that contains the issue.
In this article, we’re going to discuss this error and its causes. Then, we’ll go over two ways that you can fix the problem. Let’s get to work!
What Causes the “Cannot Modify Header Information – Headers Already Sent By” Error
As we mentioned before, you’ll run into this error when one of your site’s .php files cannot be executed. WordPress relies on .php files, such as wp-config.php and functions.php, for its core functionality.
If there’s a problem within one of the .php files that your website needs to load, you’ll see an error message that looks like this:
Warning: Cannot modify header information - headers already sent by (output started at /home/public_html/wp-config.php:#) in /home/public_html/wp-includes/file-example.php on line 33
Fortunately, the “Cannot modify header information” error provides a lot of information that makes troubleshooting relatively straightforward. The message will point you toward two files – the first one contains the problem, which prevents the second one from executing.
At the end of the error message, you’ll see a section that says “line XX.” It shows the location of the specific code that’s causing the problem.
Usually, the problem in the PHP code is pretty easy to fix. Some common causes that can trigger the error message include:
- Whitespaces before the
<?php
segment of the code or after the closing?>
tag - An HTML block before the PHP header function
print
orecho
statements added before the PHP header function- Problems with a plugin’s code
Fixing these types of errors requires you to be at least passingly comfortable with modifying PHP code. You won’t need to add any code yourself.
Still, you may need a bit of extra help identifying the problem. This is particularly true if the issue isn’t related to whitespaces or statements before the PHP header function.
The silver lining to seeing this error message- you already know which file is causing the problem and the line of code with the issue! 🤓 Learn how to fix it here 💪Click to Tweet
How To Troubleshoot the “Warning: Cannot Modify Header Information – Headers Already Sent By” Error (2 Methods)
There are two approaches to troubleshooting the “Cannot modify header information – headers already sent by” error. The first method doesn’t require you to exit the WordPress dashboard.
However, the second strategy uses FTP/SFTP if you can’t access the dashboard or use WordPress.
Let’s start with the first troubleshooting method.
1. Fix the Error With the Plugin/Theme Editor or Replace a Plugin
The first thing you need to do when you run into the “Cannot modify header information – headers already sent by” error is to open the file that’s causing the problem. Then, locate the line the message indicates.
For example, if you see an error that reads the following, it means you need to look inside your theme’s functions.php file:
Warning: Cannot modify header information - headers already sent by (output started at /home/public_html/wp-content/themes/twentytwentyone/functions.php:#) in /home/public_html/wp-includes/file-example.php on line 1
In this scenario, you can reach the source of the problem using the WordPress theme editor. To access it, go to Appearance > Theme Editor.
Once you’re in, use the menu to the right to select the file you need to access.
If you look closely, you’ll notice several whitespaces before the <?php
tag. The error message itself points toward line number one. Therefore, this tells you that the whitespaces are the sources of the problem.
In this example, all you have to do is remove the whitespaces and click on Update File. Now try reloading your website, and the error should be gone.
You can apply the same process using the WordPress plugin editor (Plugins > Plugin Editor). This method is applicable if the error message points toward a faulty plugin file.
Alternatively, you may run into an error that indicates one of the files within your WordPress plugins directory. In this scenario, you can remove and reinstall that plugin. In most cases, that will take care of the issue for you.
However, keep in mind that you might lose that plugin’s configuration, depending on which tool you use. As such, you may need to set up the add-on again.
2. Edit the Problem File via FTP/SFTP
In some cases, the source of the “Cannot modify header information – headers already sent by” error won’t lie in a file that you can access using the WordPress theme or plugin editors. Alternatively, you might be using a non-WordPress site.
In these scenarios, your best option is to access the problem file using FTP/SFTP. To do so, you’ll need to use an FTP or SFTP client such as the FileZilla platform.
You’ll also need access to your website’s FTP/SFTP credentials. In most cases, you should be able to find them within your hosting panel.
If you use Kinsta, you can access MyKinsta, select your website under Sites and click on its Info tab.
Once you have the credentials, use your FTP or SFTP client to connect to your website. You’ll need to locate the site’s root folder. Usually, its name should be root, public_html, public, or your own site’s name.
Here’s a quick look at what the inside of a WordPress root folder looks like.
Go ahead and locate the file that the “Cannot modify header information – headers already sent by” error indicates. For example, if the issue is public/wp-config.php
, right-click on the file and select the View/Edit option.
That option will open the selected file using your default text editor. Once the document is open, locate the problem by navigating to the line the error message pointed you toward.
If you can’t spot the error, you might need to consult with someone who has experience working with PHP files. However, suppose you’re dealing with a whitespace issue or a statement before the PHP header. In that case, you should be able to fix the problem yourself.
Once you’re done, save the changes to the file and close the FTP/SFTP client. Try reaccessing your website, and the error should be gone.
Seeing this error message? 😥 This post has 2 guaranteed ways tod fix it 💪Click to Tweet
Summary
The “Warning: cannot modify header information – headers already sent by” error can be intimidating because it outputs a long message. However, that detailed error message makes this bug relatively simple to troubleshoot. Unlike other problems, this one is polite enough to tell you which file is causing it and which line of code you need to look into.
Depending on the file that’s causing the error, there are two ways that you can go about troubleshooting it:
- Fix the error using the plugin/theme editor or replace a plugin.
- Edit the problem file via an FTP/SFTP client.
Finding the source of this error is simple. However, fixing it can be a problem if you’re not familiar with PHP.
Still having issues fixing this error? Please share your experience with our community in the comments below!
С этой ошибкой ко мне постоянно обращаются и спрашивают: «Где ошибка?«. Подобных писем за всё время я получил где-то штук 500, не меньше. Пора с ошибкой «Cannot modify header information — headers already sent» уже заканчивать. В этой статье я расскажу о причинах возникновения данной ошибки, а также о том, как её решить.
Если перевести данную ошибку на русский язык, то получится примерно следующее: «Нельзя изменить заголовок, поскольку они уже отправлены«. Что это за «заголовки«? Давайте разберёмся.
Когда сервер возвращает ответ клиенту, помимо тела (например, HTML-кода страницы), идут ещё и заголовки. В них содержится код ответа сервера, cookie, кодировка и множество других служебных параметров. Может ли PHP-скрипт отправить заголовок? Конечно, может. Для этого существует функция header().
Данная функция, например, постоянно используется при редиректе. Также данная функция регулярно используется при генерации изображении в PHP.
Также заголовки модифицируются при отправке cookie и при начале сессии (функция session_start()).
А теперь о том, почему же всё-таки возникает ошибка? Сервер всегда сначала отдаёт серверу заголовки, а потом тело. Если сервер уже вернул заголовки, потом пошло тело, и тут он встречает какой-нибудь session_start(). Оказывается горе-программист забыл отправить заголовки до начала тела, и теперь хочет догнать уже ушедший поезд.
Вот код с ошибкой «Cannot modify header information — headers already sent«:
<html>
<?php
session_start(); // А давайте начнём сессию
?>
Разумеется, такой бред PHP не прощает. И надо было писать так:
<?php
session_start(); // А давайте начнём сессию
?>
<html>
Вот этот скрипт уже не вызовет никаких ошибок, потому что сначала отправляются все заголовки, а уже потом идёт генерация тела ответа сервера.
Другой пример кода с ошибкой:
<?php
echo "Hello!"; // Что-нибудь выведем
session_start(); // А давайте начнём сессию
?>
То же самое, почему-то сначала выводится тело (либо его кусок), а потом вспомнили, что ещё и надо заголовки модифицировать.
Как будет правильно переписать данный код, подумайте сами.
Ещё пример:
<?php
$error = true; // Были ли ошибки?
if ($error) echo "Произошла ошибка";
header("Location: ".$_SERVER["HTTP_REFERER"]); // Делаем редирект обратно
exit;
?>
Когда у автора такого кода, ничего не получается, он удивляется от этой ошибки и говорит: «Очень странное совпадение, когда операция проходит успешно, всё хорошо, а когда какая-то ошибка, мне сообщают Cannot modify header information — headers already sent». Не дословно, но смысл именно в этом.
Проблема та же самая, и правильно писать так:
<?php
$error = true; // Были ли ошибки?
if ($error) echo "Произошла ошибка";
else header("Location: ".$_SERVER["HTTP_REFERER"]); // Делаем редирект обратно
exit;
?>
Есть и труднозаметные ошибки:
<?php
header("Location: ".$_SERVER["HTTP_REFERER"]); // Делаем редирект обратно
exit;
?>
Ошибка в данном коде возникает из-за пробела, который присутствует перед <?php. Пробел — это обычный символ, и он является частью тела ответа. И когда сервер его видит, он делает вывод о том, что заголовков больше не будет и пора выводить тело.
Бывают и следующие ошибки, имеющие всё ту же природу. Допустим есть файл a.html:
<?php echo "Hello"; ?>
Далее есть другой файл с таким кодом:
<?php
require_once "a.html";
header("Location: ".$_SERVER["HTTP_REFERER"]); // Делаем редирект обратно
exit;
?>
И человек искренне удивляется, откуда ошибка, если он ничего не выводил? Поэтому смотреть надо не конкретно 1 файл, а все файлы, которые подключаются в нём. И в тех, что подключаются у подключаемых, тоже надо смотреть, чтобы не было вывода.
И последний момент, но уже более сложный. Оказывается, что иногда эта ошибка происходит и при правильном коде. Тогда всё дело в кодировке. Убедитесь, что кодировка файла «UTF-8 без BOM«, причём именно «без BOM«, а не просто «UTF-8«. Поскольку BOM — это байты, идущие в самом начале файла, и они являются выводом.
Очень надеюсь, что данная статья поможет решить абсолютно все проблемы, связанные с ошибкой «Cannot modify header information — headers already sent«, поскольку я постарался осветить все возникающие проблемы. А дальше надо включить голову, и подумать, а что в Вашем коде не так?
-
Создано 24.12.2012 06:35:29
-
Михаил Русаков
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Introduction
Interpreting error messages in WordPress can be a time-consuming process. Finding an adequate solution to the problem is equally as difficult.
To keep your website running like clockwork, you need to prevent long periods of downtime.
Find out how to fix the “Cannot Modify Header Information” error in WordPress and get your site up and running quickly.
What Does “Cannot Modify Header Information – Headers Already Sent By” Mean?
The “Cannot Modify Header Information – Headers Already Sent By” error indicates that a .php file cannot execute because an output is being sent before calling an HTTP header. Headers always need to precede the output.
The most common causes of the «Cannot Modify Header Information» error are:
- Whitespaces before the opening <?php token.
- Whitespaces after the closing ?> tag (if one is present).
- An HTML block is in front of the header within the .php file.
- Statements that produce output, such as print or echo, are being called before the header.
- Issues with an installed plugin.
The warning message tells you which file or files you need to review to fix the issue.
In this example, the warning message indicates that the plugable.php file cannot execute due to an issue within the wp-config.php file.
Warning: Cannot modify header information - headers already sent by (output started at /home/public_html/example.com/wp-config.php:33) in /home/public_html/example.com/wp-includes/plugable.php on line 1063
You need to access and check the code within the wp-config.php file.
The message also provides the path to the file /home/public_html/example.com/wp-config.php. The number 33 points out the exact line within the code causing the error.
The file path and the code line number are an excellent starting point when troubleshooting.
Corrupted PHP File
Use cPanel or an FTP client to access the server the website is located on. It is recommended to back up files before editing them.
The examples in this guide are presented using cPanel.
Edit the File
1. Locate the file by using the path from the warning message. You can also use the search bar at the top of the cPanel dashboard.
2. Select the file and click Edit.
3. Find the code line number specified in the warning message. Use the Go To Line option to locate lines in lengthy files quickly.
4. Remove any whitespaces preceding the opening <?php token.
5. If the file contains a ?> closing tag, ensure that there are no whitespaces after the tag.
6. Click the Save Changes tab once you remove all redundant whitespaces.
Once you reload your webpage, the error message should disappear.
Move the Header Statement
Raw HTML elements in a .php file are rendered as a direct output. If an HTML element is placed before a header call, it can cause the “Cannot Modify Header Information – Headers Already Sent By” error.
To fix the error, place the HTML block after the header statement.
Functions that produce output such as vprintf, printf, echo, flush, and print statements must follow HTTP header calls.
Review the .php file specified in the error message and correct the code. Always position header calls before the output producing elements and functions.
Replace the File
If you cannot locate the corrupt file or you are hesitant to edit the code, you can replace the entire file instead.
1. Download the latest WordPress version.
2. Use an FTP client or cPanel to upload the new version of the file to your server.
3. Overwrite the existing corrupt file with the new version.
4. Reload the previously unavailable webpage.
You can upload and replace entire WordPress folders if the warning displays issues in multiple files.
Find the Plugin that Causes the Error
A faulty plugin can cause the “Cannot Modify Header Information” error.
1. Access your WordPress dashboard.
2. Deactivate and then Activate each plugin, in turn, to determine if one of them is causing the issue.
3. Refresh the affected webpage after every change you make.
Focus on the recently installed or updated plugins. The error will reappear once you turn on the failing plugin.
Gather as much data as you can during this process and inform the plugin developers of the issues you encountered.
Conclusion
By following the instructions in this guide, you have successfully identified and resolved the “Cannot Modify Header Information” error.
Warning messages that flag similar issues are not uncommon in WordPress. The presented solutions are applicable in most cases with related underlying causes.