2012-10-10 39 views
11

Estoy usando el último Sinatra y estoy alojando en Heroku. ¿Hay alguna manera de configurar los encabezados de almacenamiento en caché para mis activos estáticos servidos desde el directorio /public?¿Cómo puedo controlar el almacenamiento en caché de los activos estáticos cuando uso Sinatra?

Sinatra sirve los archivos del directorio /public antes de verificar las rutas que se han definido, por lo que no puedo simplemente el método cache_control dentro de una ruta.

El directorio /public contiene el CSS y JavaScript de mi aplicación. No quiero que el navegador descargue esos archivos cada vez, ya que no cambiarán a menudo.

+0

¿Puedes explicar un poco más claramente por qué quieres hacer esto? ¿Qué quieres lograr? –

+0

Ehm. Estoy sirviendo CSS y JavaScript que no cambian mucho, así que no quiero que el navegador cargue el archivo cada vez, sino que lo guarde en caché hasta que cargue una nueva versión. –

+0

¿Puedes definir mejor "no funcionó"? –

Respuesta

13

Puede utilizar el static_cache_control setting para establecer la cabecera Cache-Control para archivos estáticos servidos por Sinatra:

set :static_cache_control, [:public, max_age: 60 * 60 * 24 * 365] 

en cuenta que necesita utilizar una matriz explícita [...].

También esto se aplicará a todos los archivos en el directorio public, es decir, no puede especificar encabezados diferentes para los archivos css y javascript.

(Si usted es no usando Heroku y está usando Apache o Nginx para servir archivos estáticos, entonces esto no funcionará, en ese caso necesitaría configurar su servidor web por separado).

+1

Gracias, esto funciona perfectamente. :) También funciona localmente, porque también estoy usando rack, supongo. Solo una última pregunta: cuando cambio un archivo, ¿se cargará automáticamente el nuevo archivo, o debo activarlo agregando algún parámetro de URL (como '? # {File.mtime (filename)})'? –

+0

@dotweb no, el nuevo archivo no se cargará automáticamente (eso es más o menos el punto de almacenamiento en caché, el navegador ni siquiera lo solicitará, por lo que no tiene forma de saber que está desactualizado). Tendrá que utilizar algún tipo de URL param o nombre de versión para sus archivos. – matt

+0

Sí, simplemente no estaba seguro de si el servidor ya tiene alguna forma de decirle al navegador que vuelva a crear la memoria caché cuando detecta una nueva versión. De todos modos, solo usaré los parámetros de URL, gracias por tu ayuda. :) –

1

he creado un sitio simple Sinatra usando:

#!/usr/bin/env ruby 

require 'sinatra' 

get '/public/*' do 
    cache_control :public, max_age: 60 * 60 * 24 * 365 
    'this is public' 
end 

get '/' do 
    'hello world!' 
end 

Cuando solicité '/', Tengo estos encabezados:

x-frame-options: sameorigin 
x-xss-protection: 1; mode=block 
Content-Type: text/html;charset=utf-8 
Content-Length: 12 
Connection: keep-alive 
Server: thin 1.5.0 codename Knife 

200 OK 

Cuando solicité '/public/foo', tengo los siguientes:

x-frame-options: sameorigin 
x-xss-protection: 1; mode=block 
Content-Type: text/html;charset=utf-8 
Cache-Control: public, max-age=31536000 
Content-Length: 14 
Server: thin 1.5.0 codename Knife 

200 OK 

Está trabajando en una corriente Sinatra (1.3.3) en Ruby 1.9.3p194.

+2

Oh, tal vez no lo explique con suficiente detalle. En la carpeta/public en mi aplicación (no en la/url pública), están todos los archivos que se pueden ver directamente (se puede acceder a un archivo /public/app.js en /app.js sin agregar una ruta al código Ruby .) Quiero que esos archivos sean almacenados en caché. Ahora veo que lo que probé no hizo lo que realmente quería. –

Cuestiones relacionadas