Error cannot modify header information headers already sent by

When running my script, I am getting several errors like this: Warning: Cannot modify header information - headers already sent by (output started at /some/file.php:12) in /some/file.php on line...

No output before sending headers!

Functions that send/modify HTTP headers must be invoked before any output is made.
summary ⇊
Otherwise the call fails:

Warning: Cannot modify header information — headers already sent (output started at script:line)

Some functions modifying the HTTP header are:

  • header / header_remove
  • session_start / session_regenerate_id
  • setcookie / setrawcookie

Output can be:

  • Unintentional:

    • Whitespace before <?php or after ?>
    • The UTF-8 Byte Order Mark specifically
    • Previous error messages or notices
  • Intentional:

    • print, echo and other functions producing output
    • Raw <html> sections prior <?php code.

Why does it happen?

To understand why headers must be sent before output it’s necessary
to look at a typical HTTP
response. PHP scripts mainly generate HTML content, but also pass a
set of HTTP/CGI headers to the webserver:

HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>

The page/output always follows the headers. PHP has to pass the
headers to the webserver first. It can only do that once.
After the double linebreak it can nevermore amend them.

When PHP receives the first output (print, echo, <html>) it will
flush all collected headers. Afterward it can send all the output
it wants. But sending further HTTP headers is impossible then.

How can you find out where the premature output occurred?

The header() warning contains all relevant information to
locate the problem cause:

Warning: Cannot modify header information — headers already sent by
(output started at /www/usr2345/htdocs/auth.php:52) in
/www/usr2345/htdocs/index.php on line 100

Here «line 100» refers to the script where the header() invocation failed.

The «output started at» note within the parenthesis is more significant.
It denominates the source of previous output. In this example, it’s auth.php
and line 52. That’s where you had to look for premature output.

Typical causes:

  1. Print, echo

    Intentional output from print and echo statements will terminate the opportunity to send HTTP headers. The application flow must be restructured to avoid that. Use functions
    and templating schemes. Ensure header() calls occur before messages
    are written out.

    Functions that produce output include

    • print, echo, printf, vprintf
    • trigger_error, ob_flush, ob_end_flush, var_dump, print_r
    • readfile, passthru, flush, imagepng, imagejpeg

    among others and user-defined functions.

  2. Raw HTML areas

    Unparsed HTML sections in a .php file are direct output as well.
    Script conditions that will trigger a header() call must be noted
    before any raw <html> blocks.

    <!DOCTYPE html>
    <?php
        // Too late for headers already.
    

    Use a templating scheme to separate processing from output logic.

    • Place form processing code atop scripts.
    • Use temporary string variables to defer messages.
    • The actual output logic and intermixed HTML output should follow last.
  3. Whitespace before <?php for «script.php line 1» warnings

    If the warning refers to output inline 1, then it’s mostly
    leading whitespace, text or HTML before the opening <?php token.

     <?php
    # There's a SINGLE space/newline before <? - Which already seals it.
    

    Similarly it can occur for appended scripts or script sections:

    ?>
    
    <?php
    

    PHP actually eats up a single linebreak after close tags. But it won’t
    compensate multiple newlines or tabs or spaces shifted into such gaps.

  4. UTF-8 BOM

    Linebreaks and spaces alone can be a problem. But there are also «invisible»
    character sequences that can cause this. Most famously the
    UTF-8 BOM (Byte-Order-Mark)
    which isn’t displayed by most text editors. It’s the byte sequence EF BB BF, which is optional and redundant for UTF-8 encoded documents. PHP however has to treat it as raw output. It may show up as the characters  in the output (if the client interprets the document as Latin-1) or similar «garbage».

    In particular graphical editors and Java-based IDEs are oblivious to its
    presence. They don’t visualize it (obliged by the Unicode standard).
    Most programmer and console editors however do:

    joes editor showing UTF-8 BOM placeholder, and MC editor a dot

    There it’s easy to recognize the problem early on. Other editors may identify
    its presence in a file/settings menu (Notepad++ on Windows can identify and
    remedy the problem),
    Another option to inspect the BOMs presence is resorting to an hexeditor.
    On *nix systems hexdump is usually available,
    if not a graphical variant which simplifies auditing these and other issues:

    beav hexeditor showing utf-8 bom

    An easy fix is to set the text editor to save files as «UTF-8 (no BOM)»
    or similar to such nomenclature. Often newcomers otherwise resort to creating new files and just copy&pasting the previous code back in.

    Correction utilities

    There are also automated tools to examine and rewrite text files
    (sed/awk or recode).
    For PHP specifically there’s the phptags tag tidier.
    It rewrites close and open tags into long and short forms, but also easily
    fixes leading and trailing whitespace, Unicode and UTF-x BOM issues:

    phptags  --whitespace  *.php
    

    It’s safe to use on a whole include or project directory.

  5. Whitespace after ?>

    If the error source is mentioned as behind the
    closing ?>
    then this is where some whitespace or the raw text got written out.
    The PHP end marker does not terminate script execution at this point. Any text/space characters after it will be written out as page content
    still.

    It’s commonly advised, in particular to newcomers, that trailing ?> PHP
    close tags should be omitted. This eschews a small portion of these cases.
    (Quite commonly include()d scripts are the culprit.)

  6. Error source mentioned as «Unknown on line 0»

    It’s typically a PHP extension or php.ini setting if no error source
    is concretized.

    • It’s occasionally the gzip stream encoding setting
      or the ob_gzhandler.
    • But it could also be any doubly loaded extension= module
      generating an implicit PHP startup/warning message.
  7. Preceding error messages

    If another PHP statement or expression causes a warning message or
    notice being printed out, that also counts as premature output.

    In this case you need to eschew the error,
    delay the statement execution, or suppress the message with e.g.
    isset() or @()
    when either doesn’t obstruct debugging later on.

No error message

If you have error_reporting or display_errors disabled per php.ini,
then no warning will show up. But ignoring errors won’t make the problem go
away. Headers still can’t be sent after premature output.

So when header("Location: ...") redirects silently fail it’s very
advisable to probe for warnings. Reenable them with two simple commands
atop the invocation script:

error_reporting(E_ALL);
ini_set("display_errors", 1);

Or set_error_handler("var_dump"); if all else fails.

Speaking of redirect headers, you should often use an idiom like
this for final code paths:

exit(header("Location: /finished.html"));

Preferably even a utility function, which prints a user message
in case of header() failures.

Output buffering as a workaround

PHPs output buffering
is a workaround to alleviate this issue. It often works reliably, but shouldn’t
substitute for proper application structuring and separating output from control
logic. Its actual purpose is minimizing chunked transfers to the webserver.

  1. The output_buffering=
    setting nevertheless can help.
    Configure it in the php.ini
    or via .htaccess
    or even .user.ini on
    modern FPM/FastCGI setups.
    Enabling it will allow PHP to buffer output instead of passing it to the webserver instantly. PHP thus can aggregate HTTP headers.

  2. It can likewise be engaged with a call to ob_start();
    atop the invocation script. Which however is less reliable for multiple reasons:

    • Even if <?php ob_start(); ?> starts the first script, whitespace or a
      BOM might get shuffled before, rendering it ineffective.

    • It can conceal whitespace for HTML output. But as soon as the application logic attempts to send binary content (a generated image for example),
      the buffered extraneous output becomes a problem. (Necessitating ob_clean()
      as a further workaround.)

    • The buffer is limited in size, and can easily overrun when left to defaults.
      And that’s not a rare occurrence either, difficult to track down
      when it happens.

Both approaches therefore may become unreliable — in particular when switching between
development setups and/or production servers. This is why output buffering is
widely considered just a crutch / strictly a workaround.

See also the basic usage example
in the manual, and for more pros and cons:

  • What is output buffering?
  • Why use output buffering in PHP?
  • Is using output buffering considered a bad practice?
  • Use case for output buffering as the correct solution to «headers already sent»

But it worked on the other server!?

If you didn’t get the headers warning before, then the output buffering
php.ini setting
has changed. It’s likely unconfigured on the current/new server.

Checking with headers_sent()

You can always use headers_sent() to probe if
it’s still possible to… send headers. Which is useful to conditionally print
info or apply other fallback logic.

if (headers_sent()) {
    die("Redirect failed. Please click on this link: <a href=...>");
}
else{
    exit(header("Location: /user.php"));
}

Useful fallback workarounds are:

  • HTML <meta> tag

    If your application is structurally hard to fix, then an easy (but
    somewhat unprofessional) way to allow redirects is injecting a HTML
    <meta> tag. A redirect can be achieved with:

     <meta http-equiv="Location" content="http://example.com/">
    

    Or with a short delay:

     <meta http-equiv="Refresh" content="2; url=../target.html">
    

    This leads to non-valid HTML when utilized past the <head> section.
    Most browsers still accept it.

  • JavaScript redirect

    As alternative a JavaScript redirect
    can be used for page redirects:

     <script> location.replace("target.html"); </script>
    

    While this is often more HTML compliant than the <meta> workaround,
    it incurs a reliance on JavaScript-capable clients.

Both approaches however make acceptable fallbacks when genuine HTTP header()
calls fail. Ideally you’d always combine this with a user-friendly message and
clickable link as last resort. (Which for instance is what the http_redirect()
PECL extension does.)

Why setcookie() and session_start() are also affected

Both setcookie() and session_start() need to send a Set-Cookie: HTTP header.
The same conditions therefore apply, and similar error messages will be generated
for premature output situations.

(Of course, they’re furthermore affected by disabled cookies in the browser
or even proxy issues. The session functionality obviously also depends on free
disk space and other php.ini settings, etc.)

Further links

  • Google provides a lengthy list of similar discussions.
  • And of course many specific cases have been covered on Stack Overflow as well.
  • The WordPress FAQ explains How do I solve the Headers already sent warning problem? in a generic manner.
  • Adobe Community: PHP development: why redirects don’t work (headers already sent)
  • Nucleus FAQ: What does «page headers already sent» mean?
  • One of the more thorough explanations is HTTP Headers and the PHP header() Function — A tutorial by NicholasSolutions (Internet Archive link).
    It covers HTTP in detail and gives a few guidelines for rewriting scripts.

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 <?phpsegment of the code or after the closing ?> tag
  • An HTML block before the PHP header function
  • print or echo 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.

Theme Functions (functions.php) in the theme editor

Theme functions file (functions.php).

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.

SFTP/SSH in MyKinsta

SFTP/SSH in MyKinsta.

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.

A look at the WordPress root folder

WordPress root folder.

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.

Find the wp.config file in the root folder

Click on the wp.config file.

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.

Navigate to the line of the error message

Look for the line with the error message.

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:

  1. Fix the error using the plugin/theme editor or replace a plugin.
  2. 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!


Get all your applications, databases and WordPress sites online and under one roof. Our feature-packed, high-performance cloud platform includes:

  • Easy setup and management in the MyKinsta dashboard
  • 24/7 expert support
  • The best Google Cloud Platform hardware and network, powered by Kubernetes for maximum scalability
  • An enterprise-level Cloudflare integration for speed and security
  • Global audience reach with up to 35 data centers and 275 PoPs worldwide

Test it yourself with $20 off your first month of Application Hosting or Database Hosting. Explore our plans or talk to sales to find your best fit.

Дек 09, 2020

Elena B.

3хв. читання

Исправление ошибки: cannot modify header information — headers already sent by

Удивительно сколь малая ошибка может привести в полностью нерабочее состояние ваш сайт на WordPress. Мы говорим, конечно же, об известной ошибке-предупреждении WordPress Warning: cannot modify header information — headers already sent by pluggable.php (не удаётся изменить информацию заголовка). Если вы один из тех, кто столкнулся с этой ошибкой, тогда вы пришли по адресу. В этом руководстве по WordPress мы обсудим прежде всего причину появления этой ошибки и посмотрим на пути решения, которые позволят окончательно решить проблему.

Пример ошибки headers already sent

Обратите внимание, что Hostinger предлагает специальный оптимизированный для WordPress хостинг. Воспользуйтесь предложением и получите WordPress хостинг со скидкой до 82%!

К предложению

Что потребуется

Перед стартом убедитесь в наличии следующего:

  • Доступ к вашей панели управления хостингом или FTP доступ

Давайте рассмотрим пример этой ошибки, чтобы лучше понять причины. Ошибка обычно появляется в такой форме:

Warning: Cannot modify header information - headers already sent by (output started at /public_html/wp-content/plugins/my-plugin/my-function.php:#) in /public_html/wp-includes/pluggable.php on line #

Как видите, в ошибке упоминается два файла. Первый файл (в нашем случае: my-function.php размещённый в /public_html//wp-content/plugins/my-plugin/) во главе подозреваемых. Это наш пользовательский код, который предназначен для изменения функциональности ядра, обеспечиваемой WordPress. Функциональность ядра находится в файле pluggable.php (файл ядра WordPress, неизменный для любой установки WordPress). Иными словами, проблема в первом файле, который не даёт второму файлу выполняться должным образом.

Основной причиной ошибки являются лишние пробелы в первом файле. Это пробелы вверху или внизу файла, ненужные пробелы где угодно в файле или даже пробелы в PHP-тегах <?php и ?>. К слову, по причине того, что программисты могут (и обычно так и происходит) ошибочно вбивать лишние пробелы в свой код, эта ошибка наиболее часто возникает, чем можно ожидать. Строка #, указанная в сообщении об ошибке, ссылается на место расположения проблемы – это поможет устранить проблему быстрее и без суеты.

Теперь, когда вы знаете, что вызывает ошибку, вы можете перейти к её исправлению. Мы покажем вам два варианта устранения проблемы, которые вы можете попробовать по отдельности или по очереди, если по отдельности не помогло.

Вариант 1 – Редактирования неисправного файла

Первый вариант решения ошибки Warning: cannot modify header information – ручное исправление файла с ошибкой. Вы уже имеете в наличии необходимую информацию, для нахождения проблемы в самом сообщении об ошибке (помним, это первый файл в сообщении). Всё, что потребуется – это открыть этот файл по FTP, используя клиент вроде FileZilla или через файловый менеджер.

По существу, всё, о чём здесь нужно позаботиться – это убрать лишние пробелы/пустые строки в файле. Хорошее место для начала будет строка #, упомянутая в сообщении об ошибке. С этого места вы можете продолжить разбор остального файла в поисках других ненужных пробелов или пустых строк до самого конца документа.

Убедитесь в правильности написания начального и завершающего тегов PHP. Не должно быть пробела до или после тега <?php, также как и тега ?>. Также, последняя строка кода не должна завершаться пробелом или лишнем переводом строки.

На скриншоте ниже вы можете увидеть файл wp-config.php, в котором есть пробелы перед первым тегом PHP.

Лишние пробелы в wp-config причин - cannot modify header information – headers already sent by

ПОДСКАЗКА: Во многих текстовых редакторах удалить ненужные пробелы можно автоматически. Например, для удаления лишних пробелов в редакторе Atom, выделите весь код и перейдите в Packages -> Whitespace -> Remove Trailing Whitespace.

Вариант 2 – Заменить неисправный файл

Конечно, редактирование целого ряда файлов с ошибками может вызвать затруднение. Файлы могут относиться к плагину или теме, которые вы только что установили на своём сайте или даже могут быть файлами ядра WordPress.

Если ошибка действительно вызвана плагином или темой, всё что потребуется сделать – это переустановить его/её. Это действие в большинстве случаев помогает. С другой стороны, если файл ядра WordPress причина ошибки, лучшим решением взять чистую копию WordPress и заменить файл с ошибкой в вашей установке на такой же в исправной версии. Это будет гарантировать, что неисправный файл восстановлен в исходное состояние, в то время как остальная установка вашего сайта WordPress останется в целости и сохранности. Теперь, просто перезагрузите страницу и убедитесь, что ошибка исправлена.

В завершение

Независимо от того, вставили ли вы фрагмент кода в файл, добавили новый плагин/тему или написали код вручную, существует риск появления лишних пробелов в файле. Эти, казалось бы невинные пробелы, могут обернуться ошибкой WordPress Warning: cannot modify header information — headers already sent by.

В этом руководстве, мы рассмотрели как исправлять такие ошибки, и теперь ваш сайт опять работает как и положено. Больше руководств по WordPress можно найти в разделе руководств WordPress.

Author

Елена имеет профессиональное техническое образование в области информационных технологий и опыт программирования на разных языках под разные платформы и системы. Более 10 лет посвятила сфере веб, работая с разными CMS, такими как: Drupal, Joomla, Magento и конечно же наиболее популярной в наши дни системой управления контентом – WordPress. Её статьи всегда технически выверены и точны, будь то обзор для WordPress или инструкции по настройке вашего VPS сервера.

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.

Introductory image to WordPress Cannot Modify Header Information error.

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.

Example of "Cannot Modify Header Information" error in WordPress.

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.

How to edit WordPress files using cPanel.

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.

Locate the code line causing the error and remove all whitespaces.

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.

Save changes to the PHP file in cPanel.

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.

An HTML element preventing a header statement call.

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.

Overwrite a corrupt PHP file in WordPress.

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.

Where to deactivate plugins in WordPress.

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.

Cannot modify header information - headers already sent

С этой ошибкой ко мне постоянно обращаются и спрашивают: «Где ошибка?«. Подобных писем за всё время я получил где-то штук 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.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Сегодня каждый пользователь может сделать свой сайт на любом движке, в т.ч. бесплатном – Joomla, WordPress и других. Освоить азы программирования по имеющейся в сети информации тоже не составит труда. Но иногда даже малейшая ошибка в коде, допущенная при разработке сайта, может привести к его неработоспособности. И сегодня мы рассмотрим проблему Cannot modify header information — headers already sent by. И как исправить её самостоятельно, чтобы все работало без сбоев, а также разберём почему она появляется.

  • Что означает выражение Cannot modify?
  • Почему выходит ошибка и как её исправить в Вордпресс?
  • Замена неисправных файлов
  • Заключение

Картинка Cannot modify

Что означает выражение Cannot modify?

На русский язык полный текст сообщения переводится как “Нет возможности изменить заголовки – они уже были отправлены”. У этого сообщения могут еще быть такие варианты.

Как еще может выглядеть сообщение о возникшей проблеме

Другие вариации ошибки

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

  • данные о сервере;
  • кодировка;
  • куки;
  • язык сайта;
  • сессия;
  • другая служебная информация.

Ошибку Cannot modify header information — headers already sent by вызывают такие PHP-команды, как setcookie, header и другие, влияющие на работу сессий или куки.

Почему выходит ошибка и как её исправить в Вордпресс?

Как мы рассмотрели выше, в первую очередь перед загрузкой страницы нам посылаются заголовки с важной информацией, а потом уже приходят запрошенные данные. По неопытности или невнимательности программисты допускают ошибку в исходном коде. Они пытаются вначале определить другие функции (чаще всего, используя, при этом команду echo), а после этого уже занимаются установкой куки или отправкой заголовков. Чаще всего из-за этого и выскакивает ошибка на WordPress.

Рассмотрим на примерах, как выглядит рассматриваемая нами проблема.

Размещение информации перед заголовками

Сначала изучим один тип ошибки, когда программист действует по неопытности либо невнимательности. Здесь показан некорректный вариант.

Код php

А сейчас – верное написание кода.

Код html

Посмотрим внимательно на картинки и найдем место, куда закралась ошибка. Как видно в неправильном варианте, перед заголовком header идет строка echo. Вот это и есть причина проблемы – никакую информацию нельзя выводить раньше заголовков. Сначала идут данные строки header и только потом – все остальное.

Появление лишнего пробела

Причиной появления ошибки Cannot modify header information может быть и лишний пробел, который незаметен при первом взгляде. Если он присутствует в коде, то, естественно, и будет загружаться раньше, чем заголовки. В результате пользователь увидит на экране сообщение об ошибке. Пустой пробел может появиться самостоятельно, если документ открывался в стандартном блокноте Windows. Этот редактор может, не уведомляя нас, добавить служебный символ Byte Order Mark, который выставляет лишний пробел перед заголовком. Чтобы проверить, в этом ли дело, документ необходимо открыть в любом другом редакторе и проверить. Возможно, в файле будет такая ситуация, как на картинке ниже.

Неверный код html

Как видим, первая строка начинается не с <?PHP, а с пробела перед данной комбинацией. Его необходимо убрать и проблема будет устранена.

Использование команды include

Многие программисты допускают ошибку при использовании команды include. Она применяется для объединения всех файлов и создания одного итогового. И, если попытаться вначале подключить шапку сайта (меню, слайдер и т. п.). А после этого оформить заголовки, то, естественно, появится сообщение об ошибке Cannot modify…

Пример ошибки в коде php

Чтобы решить проблему, необходимо функцию header (setcookie либо session_start) в скрипте разместить первой.

Обычно в сообщении об ошибке содержится информация о том, где её искать.

Указано место, где находится проблемный файл

После output started — путь к файлу с ошибкой

После слов output started следуют сведения о том, в какой строке скрипта появилась ошибка. Необходимо пройти по этому пути и, увидев проблему, решить её – убрать лишний пробел либо поставить функцию header в самом начале.

Замена неисправных файлов

Если ошибка закралась в установленные на WordPress плагины либо темы, то их можно переустановить. Но проблема может быть также в файлах ядра. В этом случае необходимо взять файл из чистой версии движка и инсталлировать его на место проблемного. Остальные (корректные) настройки сайта на WordPress останутся нетронутыми.

Заключение

Мы узнали, что означает сообщение об ошибке с текстом Cannot modify header information — headers already sent by. А также определили пути поиска проблемы и способы её решения – удаление лишнего пробела, установка функции header в самом верху скрипта или замена неисправных файлов.

Are you bogged down by the number of times you see the PHP warning “Cannot modify header information – headers already sent…”? It is not only difficult to resolve these errors but also troublesome and frustrating to debug. Take a look at the primary causes of these errors and how you can fix them quickly.

As we know, a web page is made up of two parts – the page header and the body. When a web developer incorrectly creates or modifies a page header, he may see one of the common PHP errors. The error states “Warning: Cannot modify header information – headers already sent by …” with details of the file and line of code with the error. If the developer is unaware of the cause of this error, he may spend hours to get the issue resolved. Understanding why the error occurs will help you find the solution.

Web Page Headers

When you work on PHP for creating websites, PHP would handle the work of generating web pages for you. The header contains page information and is generally generated automatically without requiring developer intervention. The header information is mostly not seen by the user.

Developers may want to modify parts of the page header. Any incorrect configuration may lead to the “Headers already sent” errors. This error may or may not be the first error message on the page. If it is not the first error, then it may have been caused due to previous errors. Fix the errors before this one and this error message would most likely be resolved.

If the error is the first error on the page then it is likely that the cause is due to some error created by the developer, in the PHP code. Here at Templatetoaster website maker, Let us look at each of the causes and the resolution for each.

Causes and Fixes for Errors in Webpage Headers

  • Page body content sent before the header

The header must, as a rule, be sent first in the response from a web server. It is divided from the body by a single blank line. If some section of the body of the web page is sent already before the request to the header, then this error may occur.

Note that the functions that create or modify the headers must be invoked before any other output is shown. Some of the functions used for modifying the HTTP header are:

  1. header
  2. header_remove
  3. session_start
  4. session_regenerate_id
  5. setcookie
  6. setrawcookie

As a first step, find the header statement that is causing the error. The actual error must be at this line or before this line. Next, try to look for statements that could send output before the header statement. If these are present, you need to change the code and move the header statement before such statements.

  • Unparsed HTML before the Header

If there are unparsed HTML sections in a PHP file then these are considered as direct output to the browser. Scripts that trigger a header () call must be called before any raw <html> blocks. You also cannot have any HTML tags present before the header function.

Incorrect usage examples:

  1. <!DOCTYPE html>
    <?php
  2. <?php <html> header('Location: http://www.google.com'); ?>

To fix this error you should separate processing code from output generation code. Place the form processing code right at the beginning of the PHP script.

  • Extra spaces or lines before <?php or after a closing?> php tag

This error also occurs due to whitespace at the beginning or at the end of a PHP file. Extra whitespace may be added by a bad unpacking program or a non-compliant editor like the Notepad, WordPad or TextEdit.

The fix is to remove that whitespace from the file. It says “output started at … “followed by a filename and a line number. That is the file (and line) that you need to edit. Ignore the second file name – that is only a file that included the file that has the whitespace. The first file is the one you have to edit, not the second one.

  • Incorrect PHP Encoding Format

In the last case, we consider the scenario when your code is correct with no white space, HTML tags, and incorrect function calls. However, the PHP code still gives the same error.

This situation is more likely due to how the PHP file was saved. With a text editor like Notepad, you can save PHP file in different encodings like ANSI, Unicode, Unicode big endian, or UTF-8 encoding. If you choose an incorrect encoding format then the PHP script can trigger this error. The best encoding format to save PHP files is the ANSI encoding.

This encoding will not add any hidden whitespaces or characters to the file. Any of the other encodings can actually add extra characters to the PHP file. This can lead to the “headers already sent” error.

Output Buffering as a Workaround

As we have seen above, it is critical to have your code structured properly and ensure that the output is separated from the code. If this cannot be achieved then as a workaround you can try using PHPs Output Buffering.

By default the output buffering is off, the HTML is sent to the browser in pieces as PHP processes the script. If the Output Buffering is on, the HTML is stored in a variable. It is then sent to the browser as one whole at the end of the script.

You can use any of the two methods below to enable output buffering.

  1. Use the Output Buffering setting to enable output buffering. You can configure it in the php.ini file, in the .htaccess file or the .user.ini files.
  2. Use a call to the function ob_start() at the start of the invocation script. This is less reliable for following reasons:
  • A whitespace or a BOM might get added before the function making it ineffective.
  • When attempting to send binary content like a generated image, the buffered unnecessary output causes a problem. This may need an ob_clean() as a further workaround.
  • The buffer which is limited in size can be easily overrun if set to default values.

How TemplateToaster helps?

If you are a newbie or a beginner in developing websites, we recommend that you try using TemplateToaster. This WordPress website Builder lets you create websites for multiple Content Management Systems like WordPress, Joomla, Drupal etc. with the flexibility to choose from a range of templates. You would not need to get into the details of the PHP, CSS, and HTML coding which would prevent getting into errors such as the “headers already sent” error.

Часто при переносе сайта с локального компьютера можно встретиться с ошибкой вида:

Warning: Cannot modify header information - headers already sent by (output started at …

Причины такой проблемы различные. Одни из самых распространенных это:

  1. лишние символы, пробелы в файле;
  2. из-за BOM в UTF.

C первой причиной все понятно — достаточно просто удалить лишние символы и проблема исчезнет.
А вот со второй проблемой намного интереснее.

Немного теории

BOM (англ. Byte Order Mark, BOM) — это метка порядка байтов Юникода, также её часто называют сигнатурой (соответственно, UTF-8 и UTF-8 with Signature).

По наличию сигнатуры программы могут автоматически определить, является ли файл закодированным в UTF-8, однако файлы с такой сигнатурой могут некорректно обрабатываться старыми программами, в частности xml-анализаторами. Многие программы Windows (включая Блокнот) добавляют байты 0xEF, 0xBB, 0xBF в начале любого документа, сохраняемого как UTF-8 — это и есть BOM.

А теперь займемся удалением BOM

Для того, чтобы удалить BOM из файлов, необходимо будет воспользоваться консолью (подключившись по SSH). Для подключения по SSH из Windows воспользуйтесь данной статьёй. Для поиска BOM‘а в файлах сайта, можно использовать команду:

$ find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'xefxbbxbf' ] && echo "found BOM in: $file";done

Команда выведет список файлов, в которых были найдены BOM-символы.
Также можно воспользоваться данной командой:

$ grep -rl $'xEFxBBxBF' .

А с помощью нижеприведенной команды можно найти метки порядка байтов и сразу же удалить их:

$ find . -type f -exec sed 's/^xEFxBBxBF//' -i.bak {} ; -exec rm {}.bak ;

Удачной работы! Если возникнут вопросы — напишите нам, пожалуйста, тикет из Панели управления аккаунта, раздел «Помощь и поддержка».

При попытке установить тему или после неправильного редактирования кода на WordPress часто появляются ошибки. Одна из них – «Cannot modify header information — headers already sent by», которая заменяет контент сайта в браузере. На самом деле это не какая-то эксклюзивная ошибка, она может появиться и в самодельном сайте, и на другом движке. Её может спровоцировать один неверно введённый символ, отступ или команда. Найти строку с проблемой самостоятельно весьма проблематично, но не стоит пугаться, мы вам поможем исправить ошибку.

Содержание

  • Значение ошибки
  • Установка команды до заголовка
  • В записи есть лишний пробел
  • Применение команды include
  • Переустановка проблемных файлов

Значение ошибки

Чтобы понять смысл фразы, её нужно перевести на русский язык. На понятном нам языке – «Нет возможности изменить заголовки – они уже были отправлены». Это определение не даёт доступного для понимания ответа, почему появился сбой. По крайней мере оно непонятно рядовому пользователю.

Чтобы разобраться в проблеме, придётся немного углубиться в принцип загрузки страницы. Изначально браузер загружает именно заголовки, в них передаётся такая информация:

  • Кодировка;
  • Информация о сервере;
  • Cookie;
  • Оригинальный язык сайта;
  • Прочая техническая информация.

Только затем браузер переходит к обработке функций и построению сайта. При повторном изменении одной из характеристик заголовка, как раз и появляется ошибка. Это означает, что мы пытается несвоевременно или неправильно внести коррективы в заголовки. Преимущественно ошибку вызывают команды PHP: header, setcookie и некоторые другие, отвечающие за работу с cookie и сессиями.

Скорее всего из-за неопытности, программист внёс какую-то команду перед той, что влияет на заголовки. Таким образом страница уже сформировала заголовки к выполнению команды. При следующей попытке передачи данных в header появляется ошибка. Простой перенос функции часто решает проблему, но нужно знать, что и куда переносить.

Установка команды до заголовка

Это одна из самых частых причин ошибки, которая свойственна неопытным программистам. Она также может появиться по банальной невнимательности. На скриншоте видно, как быть не должно.

Сейчас появится ошибка. Как же правильно сделать то же самое?

Во втором примере всё будет работать правильно. Всё из-за того, что команда вызова текста стояла перед header. Именно неправильная очерёдность записи и стала проблемой формирования заголовков. Из-за того, что заголовки загружаются в первую очередь, обработка прочей информации о странице могла прекратиться.

Важно! Запомните, всегда заголовки идут перед какими-либо функциями и командами.

На практике не всё так просто. Мы можем поставить заголовок вначале документа, но все равно ошибка продолжит появляться. Почему так происходит? Всё дело в структуре WordPress. Данная CMS загружает массу файлов во время прогрузки страницы. Некоторые из них подгружаются сразу, а другие – в третью или последнюю очередь. Добавление записи с header в файл footer.php, content.php и другие приведут к ошибке. Подобные команды нужно вводить в header.php или аналогичный файл (зависит от темы).

В записи есть лишний пробел

Обнаружить данную причину сбоя сложнее и при ней также появляется ошибка «Cannot modify header information». Сложность в том, что визуальная разница может быть практически незаметной. В PHP любой символ и даже пробел имеет свои функции, лишний или недостающий пробел «ломает» весь сайт. Коварность проблемы ещё и в том, что вы могли не добавлять пробел самостоятельно. Он мог появиться из-за изменения кодировки, копирования команд или работы с неподходящим текстовым редактором.

Исправить проблему несложно, достаточно открыть документ иным текстовым редактором и удостовериться в правильности записи. Обращайте внимание на каждую строку, в том числе с открытием PHP-кода.

На скриншоте видно, что запись начинается с пробела, а не <?PHP. Это следует исправить, удалив пробел.

Применение команды include

Довольно часто наблюдается неправильное использование include, особенно у администраторов сайтов без опыта в программировании. Задача команды – загрузить в текущий документ другой файл. При попытке подключения файла до отправки заголовков, появляется ошибка.

Способ решения – перенести команду на пару строк ниже, после завершения формирования header. О строке с ошибкой вам сообщит встроенный инспектор кода в браузер (смотрите на информацию в скобках рядом с сообщением).

Кстати, не только функция header должна задаваться вначале файла. Те же самые правила действуют и в отношении команд setcookie, session_start.

На представленном примере, ошибка допущена в строке файла, расположенном после записи output started. Достаточно пройти в нужный раздел и найти ошибку.

Переустановка проблемных файлов

Порой ошибка появляется после установки каких-либо плагинов, тем из магазина WordPress. Причина банальна, дополнения неправильно установились или загрузились не до конца. Ещё могла быть допущена ошибка в ядре файла.

Первым делом стоит удалить дополнение и установить его заново. Если это не помогло, нужно перейти на официальную страницу плагина и изучить жалобы от других пользователей. Довольно часто умельцы исправляют ошибки разработчиков. Вам останется только пройти по предоставленной инструкции. При наличии других проблем можете связаться с технической поддержкой проблемного дополнения или установить другое.

Если на вашем сайте заметили ошибку «Cannot modify header information», не торопитесь искать программиста. Обычно её удаётся исправить с помощью простой корректировки: удаления пробела, перемещения функции или переустановки дополнения.

Понравилась статья? Поделить с друзьями:
  • Error cannot load recovery img что делать
  • Error cannot load recovery img twrp
  • Error cannot load message class for
  • Error cannot load from mysql proc the table is probably corrupted
  • Error cannot install in homebrew on arm processor in intel default prefix usr local