2009-05-16 6 views
7

Parece que no puedo obtener nginx para establecer encabezados caducados en mis recursos estáticos en mi aplicación Rails.nginx no configura los encabezados de caducidad en los activos estáticos de Rails

Mi aplicación se implementa utilizando Phusion Passenger & nginx.

A continuación se muestra la sección correspondiente de mi archivo de configuración de nginx

server { 
     listen 80; 
     server_name my.domain.tld; 
     root /home/deploy/my.domain.tld/current/public; 
     passenger_enabled on; 
     access_log off; 

     location ~* \.(ico|css|js|gif|jp?g|png)\?[0-9]+$ { 
       expires max; 
       break; 
     } 

     if (-f $document_root/system/maintenance.html) { 
       rewrite ^(.*)$ /system/maintenance.html break; 
     } 
} 

No estoy seguro de lo que su entorno no expira cabeceras en mis activos estáticos (por ejemplo /images/foo.png?123456)

no estoy seguro de si tiene algo que ver con el pasajero o si mi ubicación expresión regular simplemente no es la captura de él

Respuesta

5

Así que terminé encontrando la solución. Mi expresión regular estaba un poco desactualizada, ya que no tenía en cuenta la posibilidad de que la marca de tiempo no existiera.

Esta expresión regular funcionó para mí.

location ~* \.(ico|css|js|gif|jp?g|png)(\?[0-9]+)?$ { 
+0

Esto es engañoso.la ubicación no coincidirá con el parámetro de consulta, por lo que en realidad esto coincide con/all/image, css, js activos en la lista, independientemente del parámetro de consulta de prevención de almacenamiento en memoria caché. Esto es indeseable para muchas personas. – raggi

0

Tal vez esto ayude:

location ~* ^.*\.(ico|css|js|gif|jp?g|png)\?[0-9]+$ { 

Lea también how Nginx evaluates location. ¿Estás seguro de que no tienes ninguna otra cadena location en tu archivo de configuración que coincida con tus recursos estáticos antes de tu expresión regular location?

Por cierto, considere usar try_files en lugar de if (-f $document_root/...).

+0

no, eso es mi archivo de configuración actual. no hay otras directivas de ubicación. Voy a probar tu expresión regular y ver si establece los encabezados. Además, no estoy seguro de por qué recomienda usar try_files en lugar de la opción -f. ¿Por qué/cómo es try_files y mejora en este caso? – cpjolicoeur

+0

No estoy seguro, pero Igor (el autor) siempre recomienda usar try_files cuando las personas preguntan acerca de las reescrituras en la lista de correo de Nginx. La directiva "if (-f ...)" se puede analizar más lentamente, pero nunca he hecho ningún experimento para probar eso. – Jasiu

10

Sólo quería señalar que la toma de la marca de tiempo opcional es una mala idea - si no está incluido, y después colocar expires max es incorrecto ya que no habría ninguna manera de actualizar el archivo.

Además, la directiva location en Nginx no puede ver la cadena de consulta, por lo que la solución publicada aquí no coincide con la fecha y hora 'opcional'.

una solución adecuada (es decir, uno que envía el máximo no finaliza hasta que se solicitó el archivo con una marca de tiempo) sería:

location ~* \.(js|css|png|jpg)$ { 
    if ($query_string ~ "^[0-9]+$") { 
    expires max; 
    break; 
    } 
} 

Si no se especifica la fecha y hora, a continuación se basan en Last-Modified y ETag, que son manejados automáticamente por Nginx.

+0

Quité el 'si' ya que los activos referenciados por CSS no tendrían la marca de tiempo. –

+0

Ver el primer párrafo de mi respuesta sobre por qué esa es una muy mala idea. Debería agregar marcas de tiempo a sus activos a los que hace referencia desde su CSS. Por ejemplo: https://github.com/djanowski/collage/blob/master/lib/collage.rb#L135-142 – djanowski

0

no es necesario utilizar la directiva "break", pero access_log off; será útil:

location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ { 
     access_log off; 
     expires max; 
     add_header Cache-Control public; 
    } 

se puede ver el archivo de configuración completo en github: https://gist.github.com/711913

Cuestiones relacionadas