If-Unmodified-Since
Uso
Los clientes incluyen If-Unmodified-Since para evitar sobrescribir cambios realizados por otros. El escenario más habitual es una solicitud HTTP PUT o DELETE en la que el cliente necesita la certeza de que el recurso sigue en el estado observado anteriormente. Si otro cliente modificó el recurso después de la fecha indicada en la cabecera, el servidor rechaza la solicitud con una respuesta 412 Precondition Failed.
Esto resuelve el problema de las actualizaciones perdidas. Dos clientes obtienen el mismo recurso, ambos lo editan y ambos envían actualizaciones. Sin una precondición, la segunda actualización sobrescribe la primera en silencio. Añadir If-Unmodified-Since a la segunda solicitud garantiza que el servidor detecte el conflicto.
El valor de la cabecera usa el formato de fecha HTTP. El servidor compara esa fecha con la marca de tiempo Last-Modified del recurso. Cuando la fecha de modificación del recurso es igual o anterior al valor de If-Unmodified-Since, la condición se cumple y el servidor continúa con el procesamiento.
Para obtener garantías de consistencia más fuertes, conviene usar If-Match con un valor de ETag. Los ETag aportan precisión a nivel de bytes, mientras que las condiciones basadas en fechas tienen una resolución de un segundo.
HTTP-date
El valor sigue el formato IMF-fixdate. La fecha representa la hora de modificación más reciente que se acepta para el recurso.
If-Unmodified-Since: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
Ejemplo
Un cliente obtuvo un documento el 15 de febrero de 2025 y ahora envía una actualización. El valor de If-Unmodified-Since coincide con la fecha Last-Modified recibida en la respuesta original. Si el documento cambió después de esa marca de tiempo, el servidor responde con 412 Precondition Failed.
PUT /docs/report.json HTTP/1.1
Host: api.example.re
Content-Type: application/json
If-Unmodified-Since: Sat, 15 Feb 2025 10:30:00 GMT
Cuando se combina con una solicitud Range para subidas parciales, If-Unmodified-Since garantiza que el recurso base no ha cambiado entre fragmentos.
PATCH /files/dataset.csv HTTP/1.1
Host: api.example.re
If-Unmodified-Since: Fri, 14 Feb 2025 08:00:00 GMT
Content-Range: bytes 0-1023/4096