Amplios encabezados de información. ¿Qué son los encabezados HTTP? Teoría general. Descripción de un problema en particular.

Hoy decidimos hablar de lo que significa el mensaje "Advertencia: no se puede modificar la información del encabezado; los encabezados ya se enviaron (salida iniciada en /home/..."), que aparecía en la página del sitio en lugar de su contenido principal.
Al final resultó que, la red ha escrito lo suficiente sobre este tema, pero no hay una instrucción generalizada sobre lo que significa y cómo deshacerse de él.
Decidimos agregar algunas gotas al vasto mar de información sobre este tema, ya que enfrentamos este problema personalmente.

Hace un tiempo realizamos el traslado de varios sitios de clientes de un hosting a otro.
Todo salió bien, los sitios estaban disponibles, pero cuando intentas ir al administrador. panel, después de ingresar el nombre de usuario y la contraseña, apareció una página blanca en lugar del panel de control.
Comprobado en otros sitios, lo mismo.
Para averiguar las posibles causas, activamos la visualización de errores.
Para hacer esto, debe editar el archivo .htaccess ubicado en la raíz del sitio a través de FTP, agregando la línea:

php_flag mostrar_errores en

Después de eso, al ingresar al panel de administración, aparecieron varios mensajes como "Advertencia: no se puede modificar la información del encabezado: los encabezados ya enviados por (salida iniciada en /home/.../functions.php:1552) en /home/.../ public_html /wp-login.php en la línea 362", etc.

Como resultado de la búsqueda, se encontró información de que este mensaje informa que la información del encabezado no se puede cambiar, porque los encabezados (información sobre ellos) ya se enviaron anteriormente, y más adelante entre paréntesis se indicó en qué líneas en qué archivos esto fue hecho.


Títulos (encabezados) es la información de servicio del servidor en el que se encuentra el sitio. Antes de que el navegador muestre el contenido del sitio, recibe encabezados del servidor, que indican varios datos: si el almacenamiento en caché de la página está habilitado, su codificación, el tipo de contenido de la página y otros. En los sistemas de administración de contenido del sitio, los encabezados están formados por funciones ubicadas en varios archivos del sistema.
Condición obligatoria Los encabezados deben enviarse antes del contenido principal (contenido) de la página.


Si el contenido del sitio se transmite antes que los encabezados, surge una situación de la que se nos advierte con el mensaje "Advertencia: no se puede modificar la información del encabezado: los encabezados ya se enviaron por ..."

¿En qué situaciones puede ocurrir esto? Como ya se mencionó, en los CMS modernos los encabezados son el resultado de una o más funciones. La función en sí es un fragmento de código encerrado entre la inicial y final ?> etiquetas

Cualquier cosa fuera de estas etiquetas se considera contenido de la página.
Así, si al principio de la página hay funciones que dan como resultado encabezados enviados, y recibimos el mensaje "Advertencia: No se puede modificar la información del encabezado...", entonces resulta que alguna información relacionada con el contenido de la página es enviado desde el servidor antes de los encabezados.

¿Qué es esta información y cómo encontrarla? La mayoría de las veces se trata de espacios y líneas vacías.

Un espacio o una cadena vacía se interpreta como caracteres para el contenido principal de la página, por lo que parte del contenido principal aparece antes de los encabezados y se envía primero al navegador.

Debe descargar los archivos indicados en los mensajes "Advertencia: no se puede modificar la información del encabezado ..." en su computadora local, abrir en un editor de código (yo uso NotePad ++) y verificar cuidadosamente si hay líneas y espacios vacíos:

Al mismo tiempo, hay una característica importante que puede aumentar significativamente el tiempo de búsqueda de una solución.
Es posible que el archivo no contenga líneas y espacios en blanco, pero si se guardó en codificación UTF-8, el editor en el que se creó el archivo puede insertar un carácter extraño al comienzo del documento. Este carácter es un identificador UTF-8, igual a un espacio de ancho cero, que puede no mostrarse en absoluto en el editor, pero en el servidor se percibirá como el contenido principal y se mostrará antes de los encabezados.

Para deshacerse de este identificador, debe volver a guardar los archivos descargados en el formato UTF-8 sin lista de materiales(UTF-8 sin lista de materiales).

NotePad++ hace bien este trabajo.

Después de estas acciones y la actualización de los archivos en el servidor, el mensaje debería desaparecer y el sitio funcionará como de costumbre.

Enviado por el Jue, 05/04/2017 - 12:55

Descripción de un problema en particular.

Después de hacer clic en el botón, se muestra un error:

Advertencia: No se puede modificar la información del encabezado: los encabezados ya enviados por (salida iniciada en C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php:10) en C:\OpenServer\domains\testsite\WEB\5_phpRedirect.php en la línea 12

El código es similar al de este hilo:

Web Experimental

Seleccione un guión para descargar

Controlador de secuencias de comandos:

Cuando sucede

Tipo de error (advertencia):

Advertencia: no se puede modificar la información del encabezado; los encabezados ya los envió

Ocurre si ya ha hecho algo que requiere que se configuren los encabezados del navegador y ahora desea sobrescribirlos con otros nuevos. Por ejemplo, si ya ha mostrado el texto, php expone los encabezados (en particular, el encabezado ubicación-- que muestra si permanecer en la página solicitada o si necesita ir a otra página y obtener una respuesta a la solicitud que ya existe) para mostrarle al navegador del cliente (en su respuesta) cómo comportarse.

La raíz del problema

Lo más probable es que el problema en tu caso sea que ya estás dando contenido (etiquetas html que se mezclan en el archivo con el script) antes de comandos:

encabezado de eco ($ redirigir);

Recuerde que la función de encabezado () solo se puede llamar si el cliente aún no se han enviado datos. Es decir, debe aparecer primero en la salida, no debe haber ninguna etiqueta HTML, líneas vacías, etc. antes de llamarlo. Muy a menudo hay un error cuando al leer el código con funciones de archivo como include o require, hay espacios o líneas vacías en este código que se imprimen antes de la llamada header(). Los mismos problemas pueden ocurrir cuando se usa un solo archivo PHP/HTML.

Es decir, es necesario guardar el controlador de secuencias de comandos de html; después de todo, de hecho, no genera nada por sí mismo, sino que simplemente lo transfiere a otra dirección. Este es el primero.

encabezado ($ redirigir);

encabezado de eco ($ redirigir);

Experimentar

Dado que echo() en realidad escribe en cuerpo de respuesta http, y no en los encabezados, y el encabezado devuelve void (es decir, no devuelve valores), como se mencionó anteriormente, entonces no tiene sentido usar echo(), pero
Sin embargo, sugiero hacer un experimento:

  1. eliminar html
  2. no quites el eco

Dado que en realidad llama a header() antes de echo() (dado que header() es un argumento para echo()) y, por lo tanto, devuelve, al mismo tiempo, verifique si la función devuelve nulo, si se interpretará como una cadena vacía. o (que más bien) echo ni siquiera comenzará a funcionar ya que ya se producirá una redirección.

Repasemos la razón

Esos. antes de llamar al encabezado () no se debe mostrar ningún contenido(lo que está escrito en la descripción de la función: http://php.net/manual/ru/function.header...)

  • 1) ni con eco
  • 2) no con la ayuda del volcado habitual de texto html en el navegador.

En nuestro caso, aparentemente, echo no afecta nada, pero html en el controlador sí lo hace.

el problema fue resuelto

Las etiquetas HTML se han eliminado según su consejo. Ahora la redirección ocurre correctamente, el script del controlador se ve así:

La función de eco realmente no afecta el trabajo, es decir, puedes dejarlo como S. Holzner:

Además, al diseñar el código para la redirección, debe prestar atención a la extensión del archivo al que se realiza la transición: con la sintaxis propuesta, debe especificarse en el argumento del encabezado.

  • Iniciar sesión para publicar comentarios

Pero puedes hacer que funcione

Pero también puedes hacer que el controlador anterior funcione

Redirección de usuario

si establece la opción en el archivo php.ini

Salida_búfer = 4096

  • Iniciar sesión para publicar comentarios

Está prohibido reenviar encabezados, ¡el protocolo HTTP no funciona así! Pero, ¿qué hacer entonces? ¿Si, después de la salida en la página, también necesita iniciar la sesión y colocar la cookie? - Recuerde sobre el almacenamiento en búfer de salida.

Es decir, cuando se establece un tamaño de búfer distinto de cero, hasta que esté lleno, todavía es posible manipular los encabezados. Con un tamaño de búfer cero, después de la salida del contenido, su retorno inmediatamente precedido pasar encabezados de respuesta HTTP al cliente.

Y resulta que queremos cambiar los encabezados que ya "volaron" a través de la red al cliente (lo que significa que ya no es posible arreglarlos, en particular, el encabezado ubicación, que indica si permanecer en la página solicitada o solicitar otra: la respuesta del script "redirector" (en nuestro caso, este es un controlador de formulario) simplemente dice que necesitamos solicitar otra página), que php nos advierte sobre.

Pero: Por supuesto, es imposible resolver el problema de esta manera (no muy correctamente, más precisamente).

_____________
matfak vgu y el resto de clasicos =)

  • Iniciar sesión para publicar comentarios

Comprender los encabezados HTTP y los campos de encabezado HTTP

Encabezados HTTP proporcionar información vital necesaria para el envío de una transacción HTTP a través de protocolo http.

El formato general del encabezado HTTP contiene pares de nombre y valor separados por dos puntos en el campo del encabezado. Cada uno de los pares de nombre y valor finaliza con una secuencia de caracteres de retorno de carro (CR) y de avance de línea (LF). Los campos vacíos al final de cada encabezado indican el final del encabezado.

El formato de encabezado común seguido por las aplicaciones se ve así:

Tipos de encabezados HTTP

Hay cuatro tipos de encabezados de mensajes HTTP. Ellos son:

  • Encabezado General
  • Encabezado de solicitud
  • encabezado de respuesta
  • Encabezado de entidad

Encabezado General

Los campos de encabezado general tienen una aplicabilidad común en los mensajes de solicitud y respuesta. Los campos de encabezado se aplican solo al mensaje transmitido y no se aplican a la entidad transferida.

La estructura de un encabezado general se ve así:

control de caché El campo especifica las directivas que deben seguir todos los mecanismos de almacenamiento en caché en un sistema de solicitud y respuesta.

conexión El campo permite al remitente especificar las opciones requeridas para una conexión. El encabezado de conexión tiene el siguiente formato:

Fecha El campo representa la fecha y hora durante el inicio del mensaje. El formato de fecha especificado en HTTP parece:

pragma El campo ayuda a incluir una directiva específica de implementación aplicable a cualquier destinatario en un sistema de solicitud y respuesta.

Remolque El valor de campo especifica si un conjunto de campos de encabezado en el avance del mensaje está codificado con codificación de transferencia de fragmentos.

Codificación de transferencia campo indicar si se aplica algún tipo de transformación al cuerpo del mensaje.

Potenciar El campo permite a los clientes especificar protocolos de comunicación compatibles adicionales. También permite que el servidor cambie de protocolo con los protocolos adicionales.

Vía son campos obligatorios utilizados por proxies y puertas de enlace que indican protocolos intermedios. También indica el destinatario de la solicitud entre el agente de usuario y el servidor y la respuesta entre el servidor y el cliente.

Advertencia El campo contiene información adicional sobre el estado del mensaje y las transformaciones del mensaje que no se reflejan en el mensaje.

Los encabezados de advertencia generalmente se envían con respuestas.

El campo de encabezado de la solicitud permite a los clientes pasar información adicional de la solicitud y la información del cliente al servidor.

La estructura de un encabezado de solicitud se ve así:

aceptar El campo especifica los tipos de medios que son aceptables para la respuesta.

"*" se usa para agrupar tipos de medios en el rango

"*/*" indica todos los tipos de medios

"tipo/*" indica todos los subtipos de un tipo

Aceptar juego de caracteres El campo indica juegos de caracteres aceptables para la respuesta. Hace que los clientes sean capaces de comprender conjuntos de caracteres de propósito especial para señalar al servidor que represente el documento en estos conjuntos de caracteres.

Aceptar codificación El campo es similar a Aceptar, restringe la codificación de contenido aceptable de la respuesta.

Aceptar-Idioma El campo es similar a Aceptar, restringe el conjunto preferido de idiomas naturales.

Autorización El campo es para los agentes de usuario que desean autenticarse con el servidor.

Suponer El campo indica los comportamientos del servidor requeridos por un cliente.

Desde El campo contiene la dirección de correo electrónico de un usuario que controla el agente de usuario solicitante.

Anfitrión El campo especifica el host de Internet y el número de puerto de recurso solicitado del URI del usuario.

Si coincide campo se utiliza para hacer métodos condicionales.

Si-Modificado-Desde campo se utiliza para hacer un método condicional. Si la variante solicitada no se modifica dentro del tiempo especificado, la entidad no será devuelta desde el servidor.

Si-Ninguno-Coincide El campo permite una actualización eficiente de la información de la memoria caché con una sobrecarga de transacciones mínima.

Si rango El campo permite a los clientes recibir parte de la entidad que falta o, de lo contrario, los clientes pueden solicitar el envío de la nueva entidad completa.

Si-sin modificar-desde El campo permite que el servidor realice la operación solicitada si no se ha modificado desde el tiempo especificado en este campo.

Reenvíos máximos El campo proporciona mecanismos con métodos TRACE y OPTIONS para limitar el reenvío de solicitudes de proxy o puertas de enlace.

Autorización de apoderado El campo permite que el cliente se identifique con el proxy seguro.

Rango El campo especifica las entidades HTTP en los mensajes HTTP representados como una secuencia de bytes. La solicitud de recuperación HTTP solicita uno o más subrangos de entidades utilizando métodos GET.

referente El campo permite a los clientes especificar la dirección URI del recurso desde el que se encuentra Request-URI.

TE El campo indica la codificación de transferencia de extensión que puede aceptar en la respuesta. Además, indica si aceptará campos finales en la codificación de transferencia de fragmentos.

Agente de usuario El campo contiene información sobre el agente de usuario solicitante.

Encabezado de respuesta HTTP

El campo de encabezado de respuesta permite que el servidor pase información adicional a través de las respuestas, además de la simple respuesta de línea de estado.

La estructura del encabezado de respuesta se ve así:

Aceptar rangos El campo permite a los servidores indicar la aceptación de solicitudes de rango de recursos.

Años El campo indica al remitente la cantidad aproximada de tiempo desde que el servidor respondió.

ETag El campo proporciona el valor actual de la etiqueta de entidad para una solicitud.

ubicación El campo redirige a los destinatarios a ubicaciones distintas de Request-URI para completar la identificación de un nuevo recurso.

Autenticación de proxy El campo es una inclusión obligatoria para la respuesta de autenticación de proxy.

Reintentar después El campo se utiliza como respuesta cuando un servicio no está disponible para indicar el período durante el cual el servicio permanecerá no disponible para el cliente.

servidor El campo contiene información sobre el software utilizado por el servidor para manejar las solicitudes.

Variar campo indica el campo de solicitud que determina si una caché es elegible para usar la respuesta de una solicitud sin revalidar la respuesta.

WWW-Autenticar se utilizan cuando un mensaje de respuesta no está autorizado.

Los campos de encabezado de entidad definen la metainformación sobre el cuerpo de la entidad o el recurso solicitado. El formato de encabezado de entidad se ve así:

permitir El campo enumera el conjunto de métodos admitidos por los recursos identificados de Request-URI.

codificación de contenido El campo se utiliza como modificador de tipo de medio.

Contenido-Idioma El campo describe el lenguaje natural para los clientes de una entidad.

largancia de contenido El campo indica el tamaño de una entidad representada en número decimal.

ubicación del contenido El campo proporciona la ubicación de recursos para una entidad cuando se puede acceder a ella desde una ubicación que no sea la URI solicitada.

Contenido-MD5 El campo proporciona verificación de integridad del mensaje (MIC) mediante un resumen MD5 en el cuerpo de la entidad.

rango de contenido El campo especifica dónde se debe aplicar el cuerpo parcial del cuerpo de entidad completo.

tipo de contenido El campo indica si el tipo de medio del cuerpo de la entidad se envía al destinatario o si se utiliza el método GET para enviar solicitudes.

Caduca El campo proporciona la fecha/hora después de la cual la respuesta se vuelve obsoleta.

Última modificación campo indica la fecha y hora de la última modificación de la variante.

El orden en que aparece el nombre del campo en el encabezado cuando se recibe es insignificante. Convencionalmente, los encabezados generales se colocan primero, seguidos por el encabezado de solicitud o respuesta con el encabezado de entidad al final.

Aviso de derechos de autor: no copie ni traduzca este artículo sin el permiso previo por escrito del sitio

HTTP Debugger es un analizador HTTP sin proxy para desarrolladores que brinda la capacidad de capturar y analizar encabezados HTTP, cookies, parámetros POST, contenido HTTP y encabezados CORS desde cualquier navegador o aplicación de escritorio. Impresionante interfaz de usuario y muy fácil de usar. ¡No es un proxy, no hay problemas de red!

En este artículo, veremos para qué sirven los encabezados, sin entrar en detalles, cuál es responsable de qué. La descripción de las funciones de los encabezamientos más comunes se dará en los siguientes artículos.

Todos los artículos de la serie:

  • ¿Qué son los encabezados Http? Teoría general.

http significa Protocolo de transferencia de hipertexto (Protocolo de transferencia de hipertexto). Un protocolo es un conjunto de reglas por las que diferentes dispositivos se comunican. Fue creado en la década de 1990. Ahora se usa en Internet en casi todas partes. Todo lo que ve en la ventana del navegador se recibió a través de este protocolo. Los encabezados http son probablemente lo principal en la comunicación entre dispositivos. Transmiten información básica sobre la conexión que se está estableciendo y sobre la información que se transmite a través de esa conexión.
Echemos un vistazo al diagrama de comunicación de los dos dispositivos. Deje que estos dispositivos sean su computadora y algún servidor en Internet:

Como puede ver, el navegador envió una solicitud http. Podría verse algo como esto:

OBTENER /otro-19 HTTP/1.1
Anfitrión: www.scriptsite.ru
Agente de usuario: Mozilla/5.0 (Windows; U; Windows NT 6.0; ru; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Aceptar: texto/html,aplicación/xhtml+xml,aplicación/xml;q=0.9,*/*;q=0.8
Aceptar-Idioma: ru,en-us;q=0.7,en;q=0.3
Aceptar codificación: gzip, desinflar
Aceptar juego de caracteres: windows-1251,utf-8;q=0.7,*;q=0.7
Mantener vivo: 300
Conexión: mantener vivo

En este caso, la primera línea es una cadena de consulta, todas las demás líneas son encabezados http que contienen información adicional sobre la solicitud, sobre el cliente que solicita esta información y sobre muchas otras cosas.
En respuesta a nuestra solicitud, el servidor puede enviar los siguientes encabezados:

Servidor: Apache/2.0.61 (Unix) mod_ssl/2.0.61 OpenSSL/0.9.8k mod_dp20/0.99.2 PHP/5.2.5 mod_python/3.3.1 Python/2.5.1 mod_ruby/1.2.6 Ruby/1.8.6 (2007-09-24)

Desarrollado por X: PHP/5.2.5

Establecer-Cookie: PHPSESSID=ft47gokfee6amv3eda3k1p93s3; camino=/

Control de caché: sin almacenamiento, sin caché, debe revalidar, verificación posterior = 0, verificación previa = 0

Pragma: sin caché

Mantener vivo: tiempo de espera = 10, máximo = 1024

Conexión: Mantener vivo

Codificación de transferencia: fragmentada

Tipo de contenido: texto/html

La primera línea es la línea de estado. El resto de las líneas son encabezados. En el esquema se mostró que también se carga el contenido de la página. Pero este contenido generalmente no se muestra en complementos que ven encabezados. Y el contenido de la página es solo un caso especial. Según el protocolo, la página no tiene que ser transmitida. En su lugar, se puede transferir una imagen, un archivo de sonido y un video. Y todos ellos tienen títulos muy diferentes.

¿Cómo ver los encabezados http?

Para ver los encabezados http, recomiendo los siguientes complementos para el navegador firefox:

Si usa el navegador Chrome, puede ver toda la información haciendo clic en el botón de configuración - herramientas - herramientas para desarrolladores. pestaña de redes.
No puedo aconsejar a los usuarios del navegador opera, porque no soy amigo de este navegador. Después de instalar los complementos y ejecutarlos, intente actualizar la página. Inmediatamente verá enormes listas de solicitudes y respuestas a través de las cuales su navegador se comunicó con el servidor.

Encabezados Http y acceso a ellos en php

Si es un desarrollador de php, puede acceder a los encabezados de las solicitudes mediante la función getallheaders(). Para entender cómo funciona, ejecutemos el siguiente código:

Y obtenemos una impresión de una serie de encabezados.

Pero más a menudo se accede a ellos a través de la variable global $_SERVER. Casi todos los encabezados http tienen un nombre de elemento similar en esta variable, formado por el principio HTTP_header_name. Entonces, para el mismo 'User_Agent' hay una variable $_SERVER['HTTP_USER_AGENT'];

Para obtener los encabezados que el servidor enviará al usuario, use la función headers_list(). Como regla general, el servidor compone los encabezados obligatorios que faltan ya al final del trabajo de todos los scripts. Por lo tanto, esta matriz contendrá los encabezados, ya sea los que creó el servidor antes de comenzar la ejecución del script (y no se modificarán), o los que configuramos manualmente. Puede configurarlos manualmente usando la función header("header text");
Ejecutemos el siguiente código:

Veremos una impresión de los encabezados listos para ser enviados en el momento en que se llame a la función:

El primer encabezado se estableció automáticamente y lleva el nombre del servidor en el que se ejecuta el script. El segundo es instalado manualmente por nosotros. Si el navegador necesitara el encabezado "Fruit", lo tomaría de la respuesta http del servidor y lo usaría. Pero como nuestro navegador no lo necesita, simplemente ignora la línea que no entiende.

estructura de solicitud http

Nuestra solicitud se ve así:

La primera línea, como se mencionó anteriormente, es la cadena de consulta. Consta de tres partes:

  • método(método) - indica qué tipo de solicitud. Los métodos más comunes son: GET, POST, HEAD. Serán discutidos en el siguiente párrafo.
  • sendero(ruta) - Esta suele ser la parte de la URL que viene después del dominio. Por ejemplo, si ingresa http://www.scriptsite.ru/about/ en la barra de direcciones, el valor de la ruta será /about/.
  • protocolo(protocolo) - El protocolo a utilizar. Normalmente consta de "HTTP" y la versión del protocolo. Por lo general, los navegadores modernos usan la versión 1.1

A continuación están los encabezados en forma de cadenas del formato "Nombre: valor".
Por cierto, los datos sobre las cookies también se transmiten en esta solicitud como uno de los encabezados. La mayoría de estas líneas son opcionales. La consulta se puede reducir a dos líneas en total:

OBTENER /artículo/mostrar/4/ HTTP/1.1

Anfitrión: scriptsite.com

Métodos de solicitud

OBTENER

La solicitud de obtención generalmente se usa para solicitar un documento, pasando algunos parámetros.
Este es el método principal utilizado para obtener páginas html, imágenes, archivos CSS y JavaScript, etc.
Debido al hecho de que los parámetros pueden ser cualquier cosa y el servidor no tiene restricciones sobre cómo se procesan, a menudo se utiliza el método de solicitud de datos para transferir información. Por ejemplo, tendremos un formulario como este

En este caso, estos parámetros serán visibles en la barra de direcciones del navegador.

CORREO

Post es el método utilizado para enviar datos al servidor. Aunque puede enviar datos al servidor utilizando el método GET a través de la barra de direcciones del navegador, POST es preferible en la mayoría de los casos. Enviar grandes cantidades de datos a través de GET no es práctico. Además, GET tiene algunas restricciones que no permiten, por ejemplo, publicar este artículo en mi sitio a través de una sola línea del navegador. Las solicitudes POST se utilizan con mayor frecuencia para enviar formularios web. Modifiquemos el formulario del ejemplo anterior dándole un método POST.