Como encontrar e superar o BOM é um erro desagradável no WordPress. O que são cabeçalhos Http (cabeçalhos Http)

04.08.2021

Hoje decidimos falar sobre o que significa a mensagem "Aviso: não é possível modificar as informações do cabeçalho - cabeçalhos já enviados por (saída iniciada em /home/...", que apareceu na página do site em vez de seu conteúdo principal.
Acontece que a rede já escreveu o suficiente sobre esse assunto, mas não há instruções generalizadas sobre o que tudo isso significa e como se livrar dele.
Decidimos adicionar algumas gotas ao vasto mar de informações sobre esse assunto, pois enfrentamos esse problema pessoalmente.

Há algum tempo realizamos a transferência de vários sites de clientes de uma hospedagem para outra.
Tudo correu bem, os sites estavam disponíveis, mas quando você tenta ir para o admin. painel, após inserir o login e a senha, uma página em branco apareceu no lugar do painel de controle.
Verificado em outros sites - a mesma coisa.
Para descobrir as possíveis causas, ativamos a exibição de erros.
Para fazer isso, você precisa editar o arquivo .htaccess localizado na raiz do site via FTP, adicionando a linha a ele:

php_flag display_errors ativado

Depois disso, ao entrar no painel de administração, várias mensagens apareceram como “Aviso: Não é possível modificar as informações do cabeçalho - cabeçalhos já enviados por (saída iniciada em /home/.../functions.php:1552) em /home/.../ public_html /wp-login.php na linha 362" etc.

Como resultado da pesquisa, foi encontrada informação de que esta mensagem informa que as informações do cabeçalho não podem ser alteradas, porque os cabeçalhos (informações sobre eles) já foram enviados anteriormente, e ainda entre parênteses foi indicado em quais linhas em quais arquivos isso foi feito.


Títulos (cabeçalhos) são as informações de serviço do servidor no qual o site está localizado. Antes de o navegador exibir o conteúdo do site, ele recebe cabeçalhos do servidor, que indicam vários dados: se o cache da página está ativado, sua codificação, tipo de conteúdo da página e outros. Nos sistemas de gerenciamento de conteúdo do site, os cabeçalhos são formados por funções localizadas em vários arquivos do sistema.
condição obrigatória Os cabeçalhos devem ser enviados antes do conteúdo principal (conteúdo) da página.


Se o conteúdo do site for transmitido antes dos cabeçalhos, surge uma situação sobre a qual somos avisados ​​pela mensagem "Aviso: não é possível modificar as informações do cabeçalho - cabeçalhos já enviados por ..."

Em que situações isso pode ocorrer? Como já mencionado, no CMS moderno os cabeçalhos são o resultado de uma ou mais funções. A função em si é um pedaço de código colocado entre a inicial e final ?> Tag.

Qualquer coisa fora dessas tags é considerada conteúdo da página.
Assim, se no início da página existem funções que resultam em cabeçalhos enviados e recebemos a mensagem "Aviso: Não é possível modificar as informações do cabeçalho ...", verifica-se que algumas informações relacionadas ao conteúdo da página estão enviado do servidor antes dos cabeçalhos.

O que é essa informação e como encontrá-la. Na maioria das vezes, são espaços e linhas vazias.

Um espaço ou uma string vazia é interpretado como caracteres para o conteúdo principal da página, portanto, parte do conteúdo principal vem antes dos cabeçalhos e é enviado primeiro ao navegador.

Você precisa baixar os arquivos indicados nas mensagens "Aviso: Não é possível modificar as informações do cabeçalho ..." em seu computador local, abrir em um editor de código (eu uso o NotePad ++) e verificar cuidadosamente se há linhas e espaços vazios:

Ao mesmo tempo, há um recurso importante que pode aumentar significativamente o tempo de busca de uma solução.
O arquivo não pode conter linhas e espaços em branco, mas se foi salvo na codificação UTF-8, um caractere estranho logo no início do documento pode ser inserido pelo editor no qual o arquivo foi criado. Este caractere é um identificador UTF-8, igual a um espaço de largura zero, que pode não ser exibido no editor, mas no servidor será percebido como o conteúdo principal e exibido antes dos cabeçalhos.

Para se livrar desse identificador, você precisa salvar novamente os arquivos baixados no formato UTF-8 sem BOM(UTF-8 sem BOM).

O NotePad++ faz bem esse trabalho.

Após essas ações e atualização dos arquivos no servidor, a mensagem deve desaparecer e o site funcionará normalmente.

Com esse erro, eles constantemente entram em contato comigo e perguntam: " Onde está o erro?". Cartas semelhantes durante todo o tempo que recebi em algum lugar peças 500 , não menos. É hora de acabar com o erro "" já. Neste artigo falarei sobre as causas desse erro, bem como como resolvê-lo.

Se você traduzir esse erro para o russo, obterá algo assim: " Não é possível alterar o cabeçalho porque já foram enviados".O que é isto." manchetes"? Vamos descobrir.

Quando o servidor retorna uma resposta ao cliente, além do corpo (por exemplo, Código HTML páginas), também há títulos. Eles contêm o código de resposta do servidor, bolacha, codificação e muitos outros parâmetros de serviço. Posso script PHP enviar cabeçalho? Claro que pode. Existe uma função para isso cabeçalho().

Esta função, por exemplo, é constantemente utilizada quando . Além disso, esta função é usada regularmente quando.

Além disso, os cabeçalhos são modificados quando enviados. bolacha e no início da sessão (função sessão_início()).

E agora, por que o erro ainda ocorre? O servidor sempre fornece ao servidor os cabeçalhos primeiro e depois o corpo. Se o servidor já retornou os cabeçalhos, o corpo vai e encontra alguns sessão_início(). Acontece que o infeliz programador esqueceu de enviar os cabeçalhos antes do início do corpo e agora quer alcançar o trem que já partiu.

Aqui está o código com o erro "":



?>

claro que tanta bobagem PHP não perdoa. E eu tive que escrever assim:

sessão_inicio(); // E vamos iniciar a sessão
?>

Este script não causará mais nenhum erro, porque primeiro todos os cabeçalhos são enviados e só então o corpo da resposta do servidor é gerado.

Outro exemplo de código com um erro:

echo "Olá!"; // Saída de algo
sessão_inicio(); // E vamos iniciar a sessão
?>

A mesma coisa, por algum motivo, o corpo (ou parte dele) é exibido primeiro, e então eles lembram que os cabeçalhos também precisam ser modificados.

Como será correto reescrever este código, pense por si mesmo.

Outro exemplo:




saída;
?>

Quando o autor desse código falha, ele se surpreende com esse erro e diz: "Uma coincidência muito estranha, quando a operação é bem-sucedida, está tudo bem, mas quando ocorre algum tipo de erro, sou informado Não é possível modificar as informações do cabeçalho - cabeçalhos já enviados". Não literalmente, mas esse é o ponto.

O problema é o mesmo, e a forma correta de escrevê-lo é:

$erro = verdadeiro; // Houve algum erro?
if ($error) echo "Ocorreu um erro";
else header("Localização: ".$_SERVER["HTTP_REFERER"]); // Faz um redirecionamento de volta
saída;
?>

Há também erros sutis:

header("Localização: ".$_SERVER["HTTP_REFERER"]); // Faz um redirecionamento de volta
saída;
?>

O erro neste código ocorre por causa de um espaço, que está presente antes . Um espaço é um caractere regular e faz parte do corpo da resposta. E quando o servidor o vê, conclui que não haverá mais cabeçalhos e é hora de exibir o corpo.

Existem também os seguintes erros, que são todos da mesma natureza. Digamos que haja um arquivo a.html:

require_once "a.html";
header("Localização: ".$_SERVER["HTTP_REFERER"]); // Faz um redirecionamento de volta
saída;
?>

E a pessoa fica sinceramente surpresa, de onde vem o erro, se não exibiu nada? Então você não precisa procurar especificamente. 1 arquivo e todos os arquivos incluídos nele. E naqueles que estão conectados aos conectados, você também precisa procurar para que não haja saída.

E o último momento, mas mais difícil. Acontece que às vezes esse erro ocorre com o código correto. então tudo questão de codificação. Verifique se a codificação do arquivo é " UTF-8 sem BOM"e exatamente" sem BOM", não apenas " UTF-8". Porque o BOM são os bytes que vão bem no início do arquivo e são a saída.

Eu realmente espero que este artigo ajude a resolver absolutamente todos os problemas associados ao erro "", já que tentei cobrir todos os problemas que surgiram. E aí você precisa virar a cabeça e pensar, o que há de errado no seu código?

Este erro é fácil de corrigir.
Muitas vezes, a mesma mensagem aparece no início das sessões, com uma redação ligeiramente diferente:
Aviso: não é possível enviar cookie de sessão - cabeçalhos já enviados
Aviso: não é possível enviar limitador de cache de sessão - cabeçalhos já enviados

Marca de Ordem de Byte
Às vezes você verificou TUDO - não há nada em lugar nenhum. Alterar editor. Visualize seu arquivo em outro programa. Por exemplo, o bloco de notas do Windows, ao usar a codificação Unicode, adiciona o caractere de serviço Byte Order Mark ao início do seu arquivo, sem informá-lo de forma alguma. Abra o script em outro editor e remova os caracteres estranhos. E mude o bloco de notas para outro editor.
Ou salve em codificação UTF-8 sem BOM

Inúmeras perguntas no fórum me fazem fazer aqui nota importante:
Este erro não aparece porque você tem "algo escrito acima" em seu script. E pelo fato de o PHP exibir algo no navegador. Não precisa ser código. Poderia ser mensagem de erro. pode ser um espaço ou uma tag html. Sim Sim. Para os mais talentosos: estamos falando de qualquer personagem enviado ao navegador, não apenas daqueles que o navegador exibe ao usuário inexperiente. As páginas HTML têm código-fonte. E é ele quem é o resultado do script PHP, e não lindas letras com figuras, como pensa um grande número de pessoas.

Noções básicas sobre cabeçalhos HTTP e campos de cabeçalho HTTP

Cabeçalhos HTTP fornecer informações vitais necessárias para uma transação HTTP enviada via protocolo http.

O formato de cabeçalho HTTP geral contém nomes separados por dois pontos - pares de valores no campo de cabeçalho. Cada um dos pares nome-valor termina com um retorno de carro (CR) e uma sequência de caracteres de alimentação de linha (LF). Os campos vazios no final de cada cabeçalho indicam o final do cabeçalho.

O formato de cabeçalho comum seguido por aplicativos se parece com:

Tipos de cabeçalhos HTTP

Existem quatro tipos de cabeçalhos de mensagem HTTP. Eles são:

  • Cabeçalho Geral
  • Cabeçalho da Solicitação
  • cabeçalho de resposta
  • Cabeçalho da Entidade

Cabeçalho Geral

Campos de cabeçalho geral têm aplicabilidade comum em mensagens de solicitação e resposta. Os campos de cabeçalho se aplicam apenas à mensagem transmitida e não se aplicam à entidade transferida.

A estrutura de um cabeçalho geral se parece com:

Controle de cache O campo especifica as diretivas que devem ser seguidas por todos os mecanismos de cache em um sistema de solicitação e resposta.

conexão O campo permite que o remetente especifique as opções necessárias para uma conexão. O cabeçalho da conexão tem o seguinte formato:

Encontro campo representa a data e hora durante o início da mensagem. O formato de data especificado em HTTP se parece com:

pragma O campo ajuda a incluir a diretiva específica de implementação aplicável a qualquer destinatário em um sistema de solicitação e resposta.

Reboque O valor do campo especifica se um conjunto de campos de cabeçalho no trailer da mensagem é codificado com codificação de transferência de bloco.

Codificação de transferência O campo indica se algum tipo de transformação é aplicado ao corpo da mensagem.

Melhoria O campo permite que os clientes especifiquem protocolos de comunicação suportados adicionais. Ele também permite que o servidor alterne os protocolos com os protocolos adicionais.

Através da field são campos obrigatórios usados ​​por proxies e gateways que indicam protocolos intermediários. Também indica o destinatário da solicitação entre o agente do usuário e o servidor e a resposta entre o servidor e o cliente.

Aviso O campo carrega informações adicionais sobre o status da mensagem e as transformações da mensagem que não são refletidas na mensagem.

Os cabeçalhos de aviso geralmente são enviados com as respostas.

O campo do cabeçalho da solicitação permite que os clientes também passem informações de solicitação e informações do cliente para o servidor.

A estrutura de um cabeçalho de solicitação se parece com:

aceitar O campo especifica os tipos de mídia que são aceitáveis ​​para resposta.

"*" é usado para agrupar tipos de mídia no intervalo

"*/*" indica todos os tipos de mídia

"type/*" indica todos os subtipos de um tipo

Aceitar conjunto de caracteres campo indica conjuntos de caracteres aceitáveis ​​de resposta. Ele torna os clientes capazes de entender conjuntos de caracteres de propósito especial para sinalizar ao servidor para representar o documento nesses conjuntos de caracteres.

Aceitar Codificação campo é semelhante a Aceitar, restringe a codificação de conteúdo aceitável da resposta.

Aceitar-Idioma campo é semelhante a Aceitar, restringe o conjunto preferencial de idiomas naturais.

Autorização O campo é para agentes de usuário que desejam se autenticar com o servidor.

Espero O campo indica comportamentos de servidor exigidos por um cliente.

A partir de O campo contém o endereço de e-mail de um usuário que controla o agente do usuário solicitante.

Hospedeiro O campo especifica o host da Internet e o número da porta do recurso solicitado do URI do usuário.

Se corresponder campo é usado para criar métodos condicionais.

Se-Modificado-Desde campo é usado para criar um método condicional. Se a variante solicitada não for modificada dentro do tempo especificado, a entidade não será devolvida pelo servidor.

Se-nenhuma-correspondência O campo permite atualização eficiente de informações de cache com sobrecarga mínima de transação.

Se Faixa campo permite que os clientes recebam parte da entidade ausente ou, caso contrário, os clientes podem solicitar o envio de toda a nova entidade.

Se-Inalterado-Desde campo permite que o servidor execute a operação solicitada caso não tenha sido modificado desde o horário especificado neste campo.

Max Forwards O campo fornece mecanismos com os métodos TRACE e OPTIONS para limitar os proxies ou gateways de encaminhamento de solicitação.

Autorização de proxy O campo permite que o cliente se identifique para proteger o proxy.

Variar O campo especifica as entidades HTTP em mensagens HTTP representadas como uma sequência de bytes. A solicitação de recuperação HTTP solicita um ou mais subintervalos de entidade usando métodos GET.

Referenciador O campo permite que os clientes especifiquem o endereço URI do recurso a partir do qual o Request-URI é encontrado.

TE O campo indica a codificação de transferência de extensão que ele pode aceitar na resposta. Além disso, indica se aceitará campos de trailer na codificação de transferência de blocos.

Agente de usuário O campo contém informações sobre o agente do usuário solicitante.

Cabeçalho de resposta HTTP

O campo de cabeçalho de resposta permite que o servidor passe informações adicionais por meio das respostas, além da resposta simples da linha de status.

A estrutura do cabeçalho de resposta se parece com:

Aceitar Intervalos O campo permite que os servidores indiquem a aceitação de solicitações de intervalo de recursos.

Era O campo indica ao remetente o tempo aproximado desde que o servidor respondeu.

ETag O campo fornece o valor atual da tag de entidade para uma solicitação.

localização O campo redireciona os destinatários para locais diferentes de Request-URI para concluir a identificação de um novo recurso.

Autenticação de proxy campo é uma inclusão obrigatória para resposta de autenticação de proxy.

Repetir-Após campo é usado como resposta quando um serviço está indisponível para indicar o período pelo qual o serviço permanecerá indisponível para o cliente.

servidor O campo contém informações sobre o software usado pelo servidor para lidar com as solicitações.

Variar campo indica campo de solicitação que determina se um cache é elegível para usar a resposta de uma solicitação sem revalidação da resposta.

Autenticação WWW campo são usados ​​quando uma mensagem de resposta não é autorizada.

Os campos de cabeçalho da entidade definem metainformações sobre o corpo da entidade ou o recurso solicitado. O formato do cabeçalho da entidade se parece com:

permitir campo lista o conjunto de métodos suportados por recursos identificados por Request-URI.

codificação de conteúdo campo é usado como um modificador de tipo de mídia.

Idioma do conteúdo campo descreve a linguagem natural para clientes de uma entidade.

Comprimento do conteúdo campo indica o tamanho de uma entidade representada em número decimal.

localização do conteúdo O campo fornece localização de recurso para uma entidade quando ela é acessível de um local diferente de Requested-URI.

Conteúdo-MD5 O campo fornece verificação de integridade da mensagem (MIC) usando um resumo MD5 no corpo da entidade.

intervalo de conteúdo O campo especifica onde o corpo parcial do corpo-entidade completo deve ser aplicado.

tipo de conteúdo O campo indica se o tipo de mídia do corpo da entidade é enviado ao destinatário ou se o método GET é usado para enviar solicitações.

Expira O campo fornece a data/hora após a qual a resposta se torna obsoleta.

Última modificação campo indica a data e hora da última modificação da variante.

A ordem em que o nome do campo aparece no cabeçalho quando recebido é insignificante. Convencionalmente, os cabeçalhos gerais são colocados primeiro, seguidos pelo cabeçalho de solicitação ou resposta com o cabeçalho da entidade no final.

Aviso de direitos autorais: Por favor, não copie ou traduza este artigo sem permissão prévia por escrito do site

HTTP Debugger é um analisador HTTP sem proxy para desenvolvedores que fornece a capacidade de capturar e analisar cabeçalhos HTTP, cookies, parâmetros POST, conteúdo HTTP e cabeçalhos CORS de qualquer navegador ou aplicativo de desktop. IU impressionante e muito fácil de usar. Não é um proxy, sem problemas de rede!

Neste artigo, veremos as principais causas e soluções para o erro "Os cabeçalhos não podem ser alterados porque já foram enviados" ("Não é possível modificar as informações do cabeçalho - cabeçalhos já enviados por").

O que esse erro significa?

Para entender as causas do erro, você deve primeiro entender o que são esses "cabeçalhos".

Não vamos entrar em teoria. Digamos apenas que antes de qualquer usuário abrir uma página da web, esses mesmos "cabeçalhos" são enviados a ele, que contêm a codificação, o idioma do site, os dados do servidor e outras informações do serviço. Também vale acrescentar separadamente que cookies e sessão também são enviados em cabeçalhos.

Quais comandos causam esse erro?

Erro "Não é possível modificar as informações do cabeçalho - cabeçalhos já enviados por" pode chamar comandos PHP como header , setcookie e outros relacionados ao trabalho de cookies ou sessões.

Causas e soluções para o erro.

O erro mais comum é devido à inexperiência. Já descobrimos que os cabeçalhos são enviados antes que a própria página comece a carregar.

Mas os programadores, especialmente os iniciantes, simplesmente esquecem ou nem sabem disso. E primeiro eles tentam exibir algo na página - na maioria das vezes com a ajuda do comando echo e, em seguida, definem cookies, enviam cabeçalhos etc. O que leva a esse erro.

Aqui está um exemplo de código que resultará em tal erro:

E aqui está a opção correta:

Ou seja, primeiramente, você não pode exibir nada antes de enviar os cabeçalhos!

Nem sempre é óbvio, mas há um erro com uma pequena diferença. É quando seu documento php começa com espaços ou linhas vazias, o que significa que essas linhas são exibidas no navegador.

Isso pode ser muito difícil de acompanhar, pois, por exemplo, um bloco de notas do Windows pode adicionar uma Marca de Ordem de Byte primeiro, sem nos avisar de forma alguma e sem nem mesmo mostrar esse símbolo. Nesse caso, vale a pena abrir o documento com outros editores e conferir.

Aqui está um exemplo de cabeçalhos incorretos:

Isto é, em segundo lugar, antes

Você deve ter um cuidado especial se usar o comando include, na verdade ele combina todos os arquivos e gera um resultado, e se você incluiu primeiro o cabeçalho do site (slider, menu etc.) e depois tenta enviar os cabeçalhos no arquivo principal, então é claro que você receberá esse erro.

Aqui está um exemplo de código incorreto: