
Parece que no puedo encontrarsuficientedocumentación. Tengo una aplicación que genera algunas respuestas dinámicas, pero aún podría beneficiarse del Last-Modified
encabezado, así que la envío.
Sin embargo, al encender if_modified_since
(establecido en before
, segúnhttp://nginx.org/en/docs/http/ngx_http_core_module.html#if_modified_since) no parece tener ningún efecto en los recursos no estáticos. Por ejemplo, php, aplicaciones python.
¿Esto se debe a que Nginx no solo mira el Last-Modified
encabezado de mi respuesta? Porque puedo ver que parecen estar configurados correctamente, como se muestra a continuación:
> GET /3.0/view.json?id=2 HTTP/1.1
> Host: xxxxxxxxxxxxx
> Accept: */*
> If-Modified-Since: Sat, 02 May 2015 19:43:02 GMT
>
< HTTP/1.1 200 OK
* Server nginx/1.4.7 is not blacklisted
< Server: nginx/1.4.7
< Date: Fri, 01 May 2015 19:56:05 GMT
< Content-Type: application/json; charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Vary: Accept-Encoding
< Last-Modified: Fri, 01 May 2015 19:56:05 GMT
¿O hay algo más grande que estoy pasando por alto? Solo tengo curiosidad por saber cómo
if_modified_since
se implementa, en comparación con dónde establezco mis expectativas. Supuse que simplemente miraría los encabezados de respuesta y anularía el estado según fuera necesario. ¿Me equivoco?
Respuesta1
Enviar Last-Modified
encabezados en las respuestas de su aplicación es un comienzo, pero parece que no maneja If-Modified-Since
adecuadamente las solicitudes entrantes porque su aplicación debería responder 304 Not Modified
y no 200 OK
. Cambiar la directiva en nginx solo afecta las solicitudes atendidas directamente por nginx, es decir, recursos estáticos, a menos que lo configure como un caché de proxy inverso. En este caso, es posible que proporcione respuestas obsoletas con respecto a este valor de encabezado, ya que el contenido se almacenará en caché durante un período de tiempo sin llegar a su aplicación. Al activarlo <X>_cache_revalidate
se utilizará el If-Modified-Since
encabezado para revalidar el contenido de la caché entre la caché de nginx y su aplicación una vez que haya caducado (donde <X>
= proxy / fastcgi / scgi / uwsgi)
Respuesta2
Como no mencionó nada sobre la configuración de su caché en Nginx, asumiré que no configuró un caché y esto explicaría por qué su If-Modified-Since
encabezado no tiene efecto para las respuestas dinámicas.
Cuando se trata de recursos estáticos, Nginx tiene una manera realmente fácil de determinar cómo manejarlos If-Modified-Since
: compara la hora en el campo con la hora en que se modificó el archivo por última vez. No hay problema ahí.
Cuando desea que Nginx haga lo mismo con las respuestas generadas dinámicamente, no hay nada con lo que comparar,a menos que active el almacenamiento en caché.De forma predeterminada, Nginx no recuerda las respuestas que ha entregado. Cuando activa el almacenamiento en caché, Nginx tiene una manera de comparar una solicitud entrante con una respuesta dada previamente y, por lo tanto, tiene una manera de usar If-Modified-Since
.
He encontradoEste artículoRealmente útil para conocer los detalles más finos de la configuración de un caché de Nginx.