HTTP está escrito por el protocolo de transferencia de hipertexto. Toda la red mundial usa este protocolo. Casi la mayor parte del contenido que ve en su navegador se transmite a través del protocolo HTTP, como este artículo.
Los encabezados HTTP son solicitudes HTTP y núcleos correspondientes, y lleva información sobre navegadores de clientes, páginas de solicitudes, servidores, etc.
Cuando escriba una URL en la barra de direcciones del navegador, su navegador será similar a la siguiente solicitud HTTP:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Host: net.tutsplus.com
Agente de usuario: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; 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 el idioma: EN-US, EN; Q = 0.5
Aceptación de aceptación: GZIP, desinflar
Aceptar-Charset: ISO-8859-1, UTF-8; Q = 0.7,*; Q = 0.7
Mantener alive: 300
Conexión: mantener alive
Cookie: phpSessid = R2T5UVJQ435R4Q7IB3VTDJQ120
Pragma: no cache
Cache-Control: no cache
La primera línea se llama línea de solicitud. Describe la información básica de esta solicitud, y el resto son encabezados HTTP.
Después de completar la solicitud, su navegador puede recibir la siguiente respuesta HTTP:
HTTP/1.x 200 OK
Ecodificación de transferencia: fortado
Fecha: sábado 28 de noviembre de 2009 04:36:25 GMT
Servidor: Litespeed
Conexión: Cerrar
X-Powered-by: W3 Cache total/0.8
Pragma: público
Expira: sábado, 28 de noviembre de 2009 05:36:25 GMT
Etag: PUB1259380237; GZ
Cache-Control: Max-Age = 3600, público
Tipo de contenido: texto/html; Charset = UTF-8
Último modificado: sábado, 28 de noviembre de 2009 03:50:37 GMT
X-Pingback: http://net.tutsplus.com/xmlrpc.php
Encodificación de contenido: GZIP
Vary: Aceptar en codificación, cookie, agente de usuario
<!-... resto del html ...->
La primera línea se llama línea de estado, seguida de los encabezados HTTP. Una vez finalizado la línea en blanco, el contenido se emitirá (en este caso, alguna salida HTML).
Pero no puede ver los encabezados HTTP cuando mira el código fuente de la página, aunque se envían al navegador junto con lo que puede ver.
Esta solicitud HTTP también envía algunas solicitudes para recibir otros recursos, como imágenes, archivos CSS, archivos JS, etc.
Echemos un vistazo a los detalles a continuación.
Las siguientes extensiones de Firefox pueden ayudarlo a analizar los encabezados HTTP:
1. Firebug
2. Live HTTP Headers
3. En PHP:
Debajo del artículo, verá algunos ejemplos de uso de la demostración de PHP.
La primera línea, llamada primera línea, contiene tres partes:
Las secciones restantes son cada línea con un nombre de nombre: Valor. Contienen una variedad de información sobre solicitudes y su navegador. Por ejemplo, el agente de usuario indica la versión de su navegador y el sistema operativo que está utilizando. Aceptación de aceptación le dirá al servidor que su navegación puede aceptar una salida comprimida de manera similar a GZIP.
La mayoría de estos encabezados son opcionales. Las solicitudes HTTP incluso se pueden reducir a esto:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Host: net.tutsplus.com
Y aún puede recibir una respuesta válida del servidor.
Los tres tipos de solicitudes más comunes son: obtener, publicar y cabeza. Es posible que ya esté familiarizado con los dos primeros durante el proceso de escritura de HTML.
La mayoría de los HTML, imágenes, JS, CSS, ... que se transmiten al navegador se solicitan a través del método GET. Es la forma principal de obtener datos.
Por ejemplo, para obtener un artículo de Nettus+, la primera línea de la solicitud HTTP generalmente se ve así:
GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1
Una vez que se carga el HTML, el navegador enviará una solicitud GET para obtener la imagen, solo así:
GET /wp-content/themes/tuts_theme/images/header_bg_tall.png HTTP/1.1
El formulario también se puede enviar a través del método GET. Aquí hay un ejemplo:
<form action=foo.php method=GET>
Nombre del primer: <input name = first_name type = text />
Apellido: <input name = last_name type = text />
<input name = Action type = Subt Value = Subt />
</form>
Cuando se envía este formulario, la solicitud HTTP se verá así:
GET /foo.php?first_name=John&last_name=Doe&action=Submit HTTP/1.1
...
Puede enviar la entrada de formulario al servidor agregándola a la cadena de consulta.
Aunque puede adjuntar datos a la URL a través del método GET para pasarlo al servidor, es más apropiado usar la publicación para enviar datos al servidor en muchos casos. No es realista enviar una gran cantidad de datos a través de Get, y tiene ciertas limitaciones.
Es común usar solicitudes de publicación para enviar datos de formulario. Cambiemos el ejemplo anterior para usar la publicación:
<form action=foo.php method=POST>
Nombre del primer: <input name = first_name type = text />
Apellido: <input name = last_name type = text />
<input name = Action type = Subt Value = Subt />
</form>
Enviar este formulario creará una solicitud HTTP de la siguiente manera:
POST /foo.php HTTP/1.1
Anfitrión: localhost
Agente de usuario: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; 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 el idioma: EN-US, EN; Q = 0.5
Aceptación de aceptación: GZIP, desinflar
Aceptar-Charset: ISO-8859-1, UTF-8; Q = 0.7,*; Q = 0.7
Mantener alive: 300
Conexión: mantener alive
Referente: http: //localhost/test.php
Tipo de contenido: aplicación/x-www-form-urlencoded
Contenido-longitud: 43
First_Name = John & Last_Name = Doe & Action = enviar
Aquí hay tres cosas a tener en cuenta:
Las solicitudes de método de publicación también se pueden usar en AJAX, Aplicaciones, Curl ... Y todos los formularios de carga de archivos son necesarios para usar POST.
Head and Get son muy similares, excepto que la cabeza no acepta la parte de contenido de la respuesta HTTP. Cuando envía una solicitud principal, significa que solo está interesado en el encabezado HTTP, no en el documento en sí.
Este método permite al navegador determinar si la página ha sido modificada y, por lo tanto, controlar el caché. También se puede determinar si existe el documento solicitado.
Por ejemplo, si tiene muchos enlaces en su sitio web, simplemente puede enviarles solicitudes de cabeza por separado para determinar si hay enlaces muertos, que son mucho más rápido que usar GET.
Cuando el navegador envía una solicitud HTTP, el servidor responderá a la solicitud a través de una respuesta HTTP. Si no le importa el contenido, la solicitud se verá así:
La primera información valiosa es el acuerdo. Actualmente, el servidor usará HTTP/1.x o HTTP/1.1.
A continuación, un breve mensaje representa el estado. El código 200 significa que nuestra solicitud se ha enviado correctamente, y el servidor devolverá el documento solicitado después de la información del encabezado.
Todos hemos visto la página 404. Cuando solicito una ruta que no exista desde el servidor, el servidor nos responde con un 404 en lugar de 200.
El resto de la respuesta es similar a la solicitud HTTP. Se tratan de software del servidor, cuando se han modificado páginas/archivos, tipo mime, etc.
Del mismo modo, esta información de encabezado es opcional.
Como se mencionó anteriormente, 200 se usa para indicar que la solicitud es exitosa.
206 contenido parcialSi una aplicación solo solicita archivos dentro de un cierto rango, devolverá 206.
Esto generalmente se usa para la administración de descarga, la continuación de punto de ruptura o las descargas de fragmentación de archivos.
404 no encontradoEs fácil de entender
401 no autorizadoLas páginas protegidas con contraseña volverán a este estado. Si no ingresa la contraseña correcta, verá la siguiente información en su navegador:
Tenga en cuenta que esta es solo una página protegida con contraseña. El cuadro emergente que solicita ingresar una contraseña se ve así:
403 ProhibidoSi no tiene permiso para acceder a una página, volverá al estado 403. Esto generalmente sucede cuando intenta abrir una carpeta sin una página de índice. Si la configuración del servidor no permite ver el contenido del directorio, verá un error 403.
Otros métodos también envían restricciones de permiso, ya que puede bloquearlas a través de su dirección IP, lo que requiere alguna asistencia de HTAccess.
order allow,deny
Denegar desde 192.168.44.201
Denegar del 224.39.163.12
Denegar desde 172.16.7.92
Permitir de todos
302 (o 307) se movieron temporalmente y 301 se movieron permanentementeEstos dos estados aparecerán cuando el navegador redirige. Por ejemplo, utiliza un servicio de acortamiento de URL como bit.ly. Así es como saben quién hizo clic en su enlace.
302 y 301 son muy similares a los navegadores, pero hay algunas diferencias para los rastreadores de motores de búsqueda. Por ejemplo, si se mantiene su sitio web, redirigirá el navegador del cliente a otra dirección con 302. Los rastreadores de los motores de búsqueda reintegrarán su página en el futuro. Pero si usa la redirección 301, significa que le dice al rastreador del motor de búsqueda: su sitio web se ha trasladado permanentemente a la nueva dirección.
500 Error del servidor (error interno del servidor)Este código generalmente aparece cuando el script de la página se bloquea. La mayoría de los scripts CGI no emiten mensajes de error al navegador como PHP. Si se produce un error fatal, solo enviará un código de estado de 500. En este momento, debe verificar el registro de errores del servidor para solucionar problemas.
Lista completaPuede encontrar la descripción completa del código de estado HTTP aquí. O verifíquelo aquí (http://tools.vevb.com/table/http_status_code).
Ahora veamos alguna información de solicitud HTTP común en encabezados HTTP.
Toda esta información de encabezado se puede encontrar en la matriz $ _server de PHP. También puede usar la función GetAllHeaders () para obtener toda la información del encabezado a la vez.
Se enviará una solicitud HTTP a una dirección IP específica, pero la mayoría de los servidores tienen la capacidad de alojar múltiples sitios web en la misma dirección IP, por lo que el servidor debe saber qué nombre de dominio solicita el navegador.
Host: rlog.cn
Este es solo un nombre de host básico, que incluye nombres de dominio y nombres de dominio infantil.
En PHP, puede verlo a través de $ _Server ['http_host'] o $ _server ['server_name'].
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Esta cabeza puede llevar la siguiente información:
Este es el método general utilizado por algunos sitios web para recopilar información de visitantes. Por ejemplo, puede saber si un visitante está utilizando su teléfono para visitar su sitio web y luego decidir si dirigirlos a un sitio web móvil que funciona bien a baja resolución.
En PHP, el agente de usuario se puede obtener a través de $ _server ['http_user_agent']
if ( strstr($_SERVER['HTTP_USER_AGENT'],'MSIE 6') ) {
¡Echo, por favor, deja de usar IE6!;
}
Accept-Language: en-us,en;q=0.5
Esta información puede indicar la configuración de idioma predeterminada del usuario. Si el sitio web tiene una versión de idioma diferente, puede usar esta información para redirigir el navegador del usuario.
Se puede transportar en múltiples idiomas por segmentación de comas. El primero será el idioma preferido, y otros idiomas tendrán un valor Q para indicar la preferencia del usuario por el idioma (0 ~ 1).
Use $ _server [http_accept_language] en PHP para obtener esta información.
if (substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'fr') {
Encabezado ('Ubicación: http://french.mydomain.com');
}
Accept-Encoding: gzip,deflate
La mayoría de los navegadores modernos admiten la compresión de GZIP e informarán esta información al servidor. En este momento, el HTML comprimido se enviará al navegador. Esto puede reducir el tamaño del archivo en casi un 80% para ahorrar tiempo de descarga y ancho de banda.
Esta información se puede obtener usando $ _Server [http_accept_encoding] en PHP. Luego, el valor se detectará automáticamente cuando se llame al método Ob_GZHandler (), por lo que no necesita detectarlo manualmente.
// enables output buffering
// y toda la salida está comprimida si el navegador lo admite
ob_start ('ob_gzhandler');
Si se ha almacenado en caché una página en su navegador, la próxima vez que navegue el navegador verificará si el documento ha sido modificado y enviará un encabezado como este:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
Si no se ha modificado desde este momento, el servidor devolverá 304 no modificado y no devolverá el contenido. El navegador leerá automáticamente contenido en el caché
En PHP, puede usar $ _server ['http_if_modified_since'] para detectar.
// assume $last_modify_time was the last the output was updated
// ¿El navegador envió un encabezado si modificado?
if (isset ($ _ servidor ['http_if_modified_since'])) {
// Si el caché del navegador coincide con el tiempo modificado
if ($ last_modify_time == strTotime ($ _ servidor ['http_if_modified_since'])) {
// Enviar un encabezado 304 y sin contenido
encabezado (http/1.1 304 no modificado);
salida;
}
}
También hay un encabezado HTTP llamado ETAG, que se utiliza para determinar si la información en caché es correcta, y lo explicaremos más tarde.
Como su nombre lo indica, enviará información de cookies almacenada en su navegador al servidor.
Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120; foo=bar
Es un conjunto de pares de valor de nombre divididos por semicolones. Las cookies también pueden incluir ID de sesión.
En PHP, se puede obtener una sola cookie accediendo a la matriz $ _cookie. Puede usar directamente la matriz $ _Session para obtener la variable de sesión. Si necesita la ID de sesión, puede usar la función session_id () en lugar de la cookie.
echo $_COOKIE['foo'];
// Salida: barra
echo $ _cookie ['phpSessid'];
// Salida: R2T5UVJQ435R4Q7IB3VTDJQ120
session_start ();
echo session_id ();
// Salida: R2T5UVJQ435R4Q7IB3VTDJQ120
Como su nombre lo indica, el encabezado contendrá información de URL de referencia.
Por ejemplo, visité la página de inicio de Nettus+ y hice clic en un enlace, y este encabezado se enviará al navegador:
Referer: http://net.tutsplus.com/
En PHP, el valor se puede obtener por $ _Server ['http_referer'].
if (isset($_SERVER['HTTP_REFERER'])) {
$ url_info = parse_url ($ _ servidor ['http_referer']);
// ¿El surfista proviene de Google?
if ($ url_info ['host'] == 'www.google.com') {
parse_str ($ url_info ['consulta'], $ vars);
Echo que buscó en Google esta palabra clave :. $ vars ['q'];
}
}
// Si la URL de referencia era:
// http://www.google.com/search?source=ig&hl=en&rlz=&=&q=http+headers&aq=f&oq=&aqi=g-p1g9
// La salida será:
// buscó en Google esta palabra clave: encabezados HTTP
Es posible que haya notado que la palabra referente está mal escrita como referente. Lamentablemente, se convirtió en las especificaciones oficiales de HTTP como esa y se atascó.
Cuando una página requiere autorización, el navegador aparecerá por una ventana de inicio de sesión. Después de ingresar la cuenta correcta, el navegador enviará una solicitud HTTP, pero contendrá un encabezado:
Authorization: Basic bXl1c2VyOm15cGFzcw==
Esta parte de la información contenida en el encabezado está codificada Base64. Por ejemplo, base64_Decode ('BXL1C2VYOM15CGFZCW ==') se convertirá en 'MyUser: MyPass'.
En PHP, este valor se puede obtener con $ _Server ['Php_auth_user'] y $ _server ['Php_auth_PW'].
Explicaremos más detalles en la sección de autenticado www.
Ahora permítanme entender alguna información de respuesta HTTP en encabezados HTTP comunes.
En PHP, puede establecer la información de respuesta del encabezado a través del encabezado (). PHP ha enviado automáticamente alguna información de encabezado necesaria, como contenido cargado, configuración de cookies, etc. Puede ver el enviado y que se envíe a través de la función encabezados_list (). También puede usar la función Headers_Sent () para verificar si se ha enviado la información del encabezado.
W3.org se define como: El campo de encabezado general de control de caché se utiliza para especificar directivas que deben ser obedecidas por todos los mecanismos de almacenamiento en caché a lo largo de la cadena de solicitud/respuesta. Donde los mecanismos de almacenamiento en caché contienen información de puerta de enlace y proxy que su ISP puede usar.
Por ejemplo:
Cache-Control: max-age=3600, public
Public significa que la respuesta puede ser almacenada en caché por cualquier persona, y Max-Age indica el número de segundos que el caché es válido. Permite que su sitio web se almacene en caché para reducir en gran medida el tiempo de descarga y el ancho de banda, al tiempo que mejora la velocidad de carga del navegador.
También puede deshabilitar la memoria caché configurando el comando no-cache:
Cache-Control: no-cache
Para más detalles, consulte W3.org.
Este encabezado contiene el tipo mime del documento. El navegador decidirá cómo analizar el documento basado en este parámetro. Por ejemplo, una página HTML (o una página PHP con salida HTML) devolverá algo así:
Content-Type: text/html; charset=UTF-8
'Text' es el tipo de documento, y 'html' es el subtipo de documento. Este encabezado también incluye más información, como Charset.
Si es una imagen, se enviará una respuesta como esta:
Content-Type: image/gif
El navegador puede usar MIME-Type para decidir si usar programas externos o extender el documento en sí. El siguiente ejemplo reduce la llamada a Adobe Reader:
Content-Type: application/pdf
Carga directamente, Apache generalmente juzgará automáticamente el tipo MIME del documento y agregará información adecuada al encabezado. Además, la mayoría de los navegadores tienen un cierto grado de tolerancia a fallas. Si el encabezado no proporciona o proporciona la información incorrectamente, detectará automáticamente el tipo MIME.
Puede encontrar una lista de tipos MIME de uso común aquí.
En PHP, puede usar finfo_file () para detectar el tipo IME del archivo.
Este encabezado le dirá al navegador que abra una ventana de descarga de archivo en lugar de intentar analizar el contenido de la respuesta. Por ejemplo:
Content-Disposition: attachment; filename=download.zip
Hace que el navegador tenga un diálogo como este:
Tenga en cuenta que la información del encabezado de tipo de contenido que se adapta a ella también se enviará.
Content-Type: application/zip
Disposición de contenido: archivo adjunto; FileName = download.zip
Cuando el contenido se transfiere al navegador, el servidor puede usar este encabezado para informar al navegador del tamaño (bytes) del archivo que se transferirá.
Content-Length: 89123
Esta información es bastante útil para descargas de archivos. Es por eso que el navegador conoce el progreso de la descarga.
Por ejemplo, aquí escribí un script virtual para simular una descarga lenta.
// it's a zip file
Header ('Content-Type: Application/Zip');
// 1 millón de bytes (aproximadamente 1megabyte)
encabezado ('Content-longitud: 1000000');
// Cargue un cuadro de diálogo de descarga y guárdelo como descargar.zip
Header ('Contenido-Disposición: Adjunto; FileName = download.zip');
// 1000 veces 1000 bytes de datos
para ($ i = 0; $ i <1000; $ i ++) {
echo str_repeat (., 1000);
// duerme para reducir la velocidad de la descarga
Usleep (50000);
}
El resultado será así:
Ahora, comento el encabezado de longitud de contenido:
// it's a zip file
Header ('Content-Type: Application/Zip');
// El navegador no sabrá el tamaño
// encabezado ('Content-longitud: 1000000');
// Cargue un cuadro de diálogo de descarga y guárdelo como descargar.zip
Header ('Contenido-Disposición: Adjunto; FileName = download.zip');
// 1000 veces 1000 bytes de datos
para ($ i = 0; $ i <1000; $ i ++) {
echo str_repeat (., 1000);
// duerme para reducir la velocidad de la descarga
Usleep (50000);
}
El resultado se convirtió en esto:
Este navegador solo le dirá cuánto ha descargado, pero no le dirá cuánto necesita descargar en total. Y la barra de progreso no mostrará progreso.
Esta es otra información de encabezado generada para caché. Se verá así:
Etag: pub1259380237;gz
El servidor puede responder a esta información con cada archivo enviado al navegador. Este valor puede contener la última fecha modificada, tamaño del archivo o suma de verificación de archivos del documento. La navegación lo almacenará en caché con el documento recibido. La próxima vez que el navegador solicite el mismo archivo nuevamente, se enviará la siguiente solicitud HTTP:
If-None-Match: pub1259380237;gz
Si el valor del documento solicitado es consistente con él, el servidor enviará un código de estado 304 en lugar de 2oo. Y no se devuelve ningún contenido. El navegador cargará el archivo desde el caché en este momento.
Como su nombre indica, esta información del encabezado utiliza el formato GMT para indicar el último tiempo de modificación del documento:
Last-Modified: Sat, 28 Nov 2009 03:50:37 GMT
$modify_time = filemtime($file);
encabezado (último modificado :. gmdate (d, d myh: i: s, $ modify_time). gmt);
Proporciona otro mecanismo de almacenamiento en caché. El navegador puede enviar una solicitud como esta:
If-Modified-Since: Sat, 28 Nov 2009 06:38:19 GMT
Ya lo hemos discutido en la sección If-Modified-Since.
Este encabezado se usa para la redirección. Si el código de respuesta es 301 o 302, el servidor debe enviar el encabezado. Por ejemplo, cuando visita http://www.nettus.com, el navegador recibirá la siguiente respuesta:
HTTP/1.x 301 Moved Permanently
...
Ubicación: http://net.tutsplus.com/
...
En PHP puede redirigir a los visitantes de esta manera:
header('Location: http://net.tutsplus.com/');
Por defecto, se enviará el código de estado 302. Si desea enviar 301, simplemente escríbelo así:
header('Location: http://net.tutsplus.com/', true, 301);
Cuando un sitio web necesita establecer o actualizar la información de las cookies que navega, usará dicho encabezado:
Set-Cookie: skin=noskin; path=/; domain=.amazon.com; expires=Sun, 29-Nov-2009 21:42:28 GMT
Set-cookie: session-id = 120-7333518-8165026; ruta =/; dominio = .amazon.com; expiras = sábado 27 de febrero 08:00:00 2010 GMT
Cada cookie se usará como encabezado separado. Tenga en cuenta que configurar cookies a través de JS no se reflejará en el encabezado HTTP.
En PHP, puede configurar cookies a través de la función SetCookie (), y PHP enviará encabezados HTTP apropiados.
setcookie(TestCookie, foobar);
Enviará un encabezado como este:
Set-Cookie: TestCookie=foobar
Si no se especifica el tiempo de vencimiento, la cookie se eliminará después de que se cierre el navegador.
Un sitio web puede enviar esta información de encabezado a través de HTTP para verificar a los usuarios. Se abrirá una ventana emergente cuando el navegador vea esta respuesta en la cabeza.
WWW-Authenticate: Basic realm=Restricted Area
Se verá así:
En un capítulo del manual de PHP, hay un código simple que demuestra cómo hacer algo como esto con PHP:
if (!isset($_SERVER['PHP_AUTH_USER'])) {
Header ('www-autenticate: reino básico = my reas');
encabezado ('http/1.0 401 no autorizado');
echo 'texto para enviar si el usuario presiona el botón de cancelación';
salida;
} demás {
echo <p> hola {$ _server ['php_auth_user']}. </p>;
echo <p> Ingresó {$ _server ['php_auth_pw']} como su contraseña. </p>;
}
Este encabezado generalmente se establece cuando el contenido de retorno se comprime.
Content-Encoding: gzip
En PHP, si llama a la función ob_gzhandler (), este encabezado se establecerá automáticamente.
Dirección original: http://css9.net/all-upout-http-teaders/