Petición HTTP

La petición o HTTP request es el mensaje que se envía desde el cliente al servidor para solicitar un resource

Contenido modificable

Si ves errores o quieres modificar/añadir contenidos, puedes crear un pull request. Gracias

Estructura de un HTTP request

Un HTTP request se compone de:

  • Método: GET, POST, PUT, etc. Indica que tipo de request es.
  • Path: la URL que se solicita, donde se encuentra el resource.
  • Protocolo: contiene HTTP y su versión, actualmente 1.1.
  • Headers. Son esquemas de key: value que contienen información sobre el HTTP request y el navegador. Aquí también se encuentran los datos de las cookies. La mayoría de los headers son opcionales.
  • Body. Si se envía información al servidor a través de POST o PUT, ésta va en el body.

Ejemplo de HTTP request:

GET php.net HTTP/1.1 **Accept**: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
**Accept-Encoding**: gzip, deflate, sdch
**Accept-Language**: es-ES,es;q=0.8,en;q=0.6
**Cache-Control**: max-age=0
**Connection**: keep-alive
**Cookie**: COUNTRY=NA%2C122.16.430.651; LAST_LANG=es; LAST_NEWS=3847110839
**Host**: php.net
**If-Modified-Since**: Mon, 09 Nov 2015 11:50:11 GMT
**Upgrade-Insecure-Requests**: 1
**User-Agent**: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36

La primera línea es la línea del request, que contiene su información básica (método HTTP, URL y versión). Lo demás son headers HTTP.

Headers de un HTTP request

Los headers pueden obtenerse con el array $_SERVER en PHP. La función _getallheaders() _devuelve todos los headers de vez.

Los headers más comunes en los HTTP requests son los siguientes:

  • Host
    Host: php.net

Es el nombre del host, incluyendo dominio y subdominio si existe. En PHP se obtiene con $_SERVER['HTTP_HOST'] o $_SERVER['SERVER_NAME'].

  • User-Agent
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36

El User-Agent contiene información como el nombre y versión del navegador y del sistema operativo y el idioma por defecto. De esta forma los sitios web pueden saber información acerca de los sistemas de los visitantes. Pueden detectar si el usuario está visitando desde un móvil y redireccionarlo a una versión móvil más adecuada para bajas resoluciones. En PHP se encuentra bajo $_SERVER['HTTP_USER_AGENT'].

  • Accept-Language
    Accept-Language: en-us, en;q=0.5

Este header muestra el lenguaje por defecto del usuario. Si el sitio web tiene diferentes versiones por idiomas, puede redireccionar al usuario. En PHP: $_SERVER['HTTP_ACCEPT_LANGUAGE'].

if(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) == 'es'){
    header('Location: http://es.ejemplo.com');
}
  • Accept-Encoding
    Accept-Encoding: gzip, deflate, sdch

Formatos de codificación que soporta el navegador. El servidor web puede enviar el HTML resultante en un formato comprimido, lo que ahorra hasta un 80% de bandwidth y tiempo de carga. En PHP: $_SERVER['HTTP_ACCEPT_ENCODING'].

  • If-Modified-Since
    If-Modified-Since: Mon, 9 Nov 2015 08:32:10 GMT

Si no se ha modificado el resource desde esa fecha, el servidor devolverá un código de respuesta 304 Not Modified, sin contenido, ya que el navegador cargará el contenido de la caché. En PHP: $_SERVER['HTTP_IF_MODIFIED_SINCE'].

// Comprobar si el explorador envía el header If-Modified-Since
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){
    // Comprobar si el cache del navegador coincide con el modify time
    if($last_modify_time == strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])){
        // Enviar un header 304, sin contenido
        header("HTTP/1.1 304 Not Modified");
        exit;
    }
}

También está el header Etag, que se asegura de que la caché es actual.

  • Cookie
    Cookie: PHPSESSID=rqwe8f1ew8f1341fiu; usuario=homer

Envía las cookies guardadas en el navegador para ese dominio. En PHP: array $_COOKIE.

  • Referer

Referer. Contiene la url de referencia. Si un usuario hace click en un enlace, en la página de destino aparecerá como referer la anterior. En PHP: $_SERVER['HTTP_REFERER'].

if(isset($_SERVER['HTTP_REFERER'])){
    $url = parse_url($_SERVER['HTTP_REFERER']);
    // Comprobar si el visitante viene de google
    if($url['host'] == 'www.google.com'){
        parse_str($url['query'], $vars);
        echo "Has buscado estas palabras: " . $vars['q'];
    }
}
  • Authorization

Cuando un sitio web solicita autorización, el navegador abre una ventana de login. Cuando insertas los datos de entrada, el navegador envía otro request, pero esta vez contiene:

Authorization: Basic bXl1c2VyOm15cGFzcw==

El dato incluído está codificado en base 64. La función base64_decode('bXl1aefi128djGFzcw==') devuelve 'myuser:mypass'.

En PHP: $_SERVER['PHP_AUTH_USER'] y $_SERVER['PHP_AUTH_PW'].