ETag
====

El encabezado de respuesta de HTTP **`ETag`** es un identificador para una versión específica de un recurso. Permite a la memoria caché ser más eficiente, y ahorrar ancho de banda, en tanto que un servidor web no necesita enviar una respuesta completa si el contenido no ha cambiado. Por otro lado, si el contenido cambió, los etags son útiles para ayudar a prevenir actualizaciones simultáneas de un recurso de sobre-escribirlo por otro ("colisiones en el aire").

Si el recurso en una URL dada cambia, un valor Etag debe ser generado. De esta forma los Etags son muy similares a las huellas digitales y pueden también usarse para propósitos de rastreo por algunos servidores. Un comparativo de ellos permite rápidamente determinar cuándo dos representaciones de un recurso son las mismas, pero podrían también configurarse para persistir indefinidamente por un servidor en rastreo.

| Tipo de Encabezado | Response header |
| --- | --- |
| Forbidden header name | no |

Sintaxis
--------
```

ETag: W/"<valor_etag>"
ETag: "<valor_etag>"
```

Directivas
----------

`W/` Opcional

`'W/'` (sensible a mayúsculas) indica que se usa un validador débil. Los validadores débiles son fáciles de generar pero son menos útiles para realizar comparativos. Los validadores fuertes son ideales para realizar comparativos pero pueden ser muy difíciles de generar de forma eficiente. Los valores Etag débiles de dos representaciones de los mismos recursos podrían ser semánticamente equivalentes, pero no idénticos byte por byte. Esto significa que los Etag débiles previenen el almacenamiento en caché cuando el range request por byte es usado, a su vez los Etag fuertes permiten que los range request puedan utilizar el almacenamiendo en caché.

"<valor\_etag>"

Las Etiquetas de Entidad (ETags) representan de forma única a los recursos. Son una cadena de caracteres ASCII puestas entre comillas dobles (Como `"675af34563dc-tr34"`). El método por el cual se generan los valores `ETag` no está especificado. Muchas veces, se usa una etiqueda del contenido, una etiqueta de la fecha y hora de la última modificación, o sólo una revisión. Por ejemplo, MDN usa una etiqueda de dígitos hexadecimales para el contenido wiki.

Ejemplos
--------
```

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
ETag: W/"0815"
```

### Evitando las colisiones en el aire

Con la ayuda del `ETag` y los encabezados `If-Match` (en-US) se puede ser capaz de detectar las colisiones de edición en el aire.

Por ejemplo cuando se edita MDN, el contenido wiki actual es etiquetado y puesto en un `Etag` en la respuesta:
```

ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
```


Cuando se guarda los cambios de una página a una página wiki (datos posteados), la petición `POST` contendrá el encabezado que contiene los valores `ETag` para revisar la frescura entre ellas.
```

If-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
```


Si las etiquetas no concuerdan, significa que el documento ha sido editado de por sí y se lanza un error `412` (en-US) `Precondition Failed`.

### Caching de los recursos invariados

Otro caso típico del uso del encabezado `ETag` es el cacheo de recursos que no han variado. Si un usuario visita una URL dada nuevamente (la que tiene un conjunto `ETag`), y está *viciado*, es decir que es muy viejo para considerarlo usable, el cliente enviará el valor de su `ETag` a través de un campo de encabezado `If-None-Match` (en-US):
```

If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"
```


El servidor compara el `ETag` del cliente (enviado con un `If-None-Match`) con el `ETag` para su versión actual del recurso y si ambos valores concuerdan (esto es, el recurso no ha cambiado), el servidor envió un estado `304` `Not Modified`, sin ningún cuerpo, lo cual le dice al cliente que la versión cacheada de la respuesta todavía es buena para usar (*refrescar*).

Especificaciones
----------------

| Specification |
| --- |
| HTTP Semantics # field.etag |

Compatibilidad con navegadores
------------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Vea también
-----------

* `If-Match` (en-US)
* `If-None-Match` (en-US)
* `304` `Not Modified`
* `412` (en-US) `Precondition Failed`
* W3C Note: Editing the Web – Detecting the Lost Update Problem Using Unreserved Checkout