La configuración de encabezados caduca para contenido estático servido desde nginx

96

Estoy usando nginx para almacenar mi contenido estático, ¿hay alguna manera de que pueda configurar los encabezados de caducidad para cada archivo que cumpla con una regla específica? Por ejemplo, ¿puedo establecer el encabezado de caducidad para todos los archivos que tienen una extensión de '.css'?

Unkwntech
fuente

Respuestas:

126

Prefiero hacer un encabezado de caché más completo, además de algunas extensiones de archivo más. Los '?' el prefijo es una marca de 'no captura', nginx no creará $ 1. Ayuda a reducir la carga innecesaria.

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}
JM Becker
fuente
77
No se encontraron todos mis archivos estáticos después de agregar eso.
Jürgen Paul
@JackSpairow: Realmente no puedo explicar por qué sucedió eso, ya que siempre me ha funcionado. ¿Está ejecutando Nginx sin el módulo de suministro add_header? Este tipo de cosas realmente tiene un alcance limitado, ¿está seguro de que otra desaceleración no es un problema en combinación?
JM Becker
24
Probablemente otro bloque tenía una definición para los archivos estáticos con un rootconjunto, en ese caso debería agregar las directivas a ese bloque. (Sé que esto es 2 años tarde, pero para futuros ciudadanos)
aularon
1
Agradezco personalmente las aclaraciones, especialmente para los futuros buscadores porque a menudo aparecen mucho después de la publicación original. +1: P
JM Becker
usar esto arruina totalmente mi sitio web de WordPress. CSS e imágenes no se muestran. ¿Hay algún otro conflicto en alguna parte?
user1641443
22
server {
    ...

    location ~* \.css$ {
       expires 30d;
    }
    ...
}

La locationdirectiva

La expiresdirectiva

Dave Cheney
fuente
17

No tengo suficiente reputación para comentar por qué la respuesta aceptada haría que los archivos ya no aparezcan, ¡pero lo descubrí y me gustaría ayudar!

Version corta:

¡Asegúrese de tener un directorio raíz especificado para su bloque de ubicación en las imágenes si no tiene un conjunto global!

Versión larga a continuación:


En primer lugar, mi método para implementar esta solución fue realmente similar a esta respuesta , donde escribes la regla (como en la respuesta aceptada):

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}

en un archivo img-cache.conf

y luego incluya ese archivo en su server {...}directiva.

Mi ejemplo de somesite.com en mi carpeta de sitios disponibles:

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

De esa manera, puede agregar el bloque de ubicación de almacenamiento en caché de imágenes a varios sitios que pueda estar ejecutando.


En segundo lugar, tengo una situación en la que mi / var / www / contiene dos carpetas que permito como public_html: seguridad y capacitación, por lo que tengo que crear bloques de ubicación específicos en la directiva del servidor de mi sitio para distinguir estas carpetas.

Como tal, no tengo un conjunto de directorios raíz global .

Por lo tanto, cuando crea los bloques de ubicación de la imagen, es posible que no les proporcione un directorio raíz desde el que buscar las imágenes.

Mi solución fue entonces:

location ~ ^/training.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

location ~ ^/.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/secure;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}
amurrell
fuente
1
+1 por hacer esto reutilizable .conf. La carpeta apropiada en nginx/1.14.0 (Ubuntu)parece ser /etc/nginx/snippets/.
Jan Werkhoven
9

También puede establecer los vencimientos al máximo. Aquí está la directiva que uso para css y js.

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}
Jauder Ho
fuente
1
Usaría la directiva raíz solo en el bloque del servidor {}, cuando la use en ubicaciones secundarias tiene consecuencias inesperadas. No necesitas el descanso; tampoco, como no estás en un bloque if {}
Dave Cheney
Tienes razón. Olvidé limpiar esto. Editado para reflejar esto.
Jauder Ho
4

Todas las soluciones antes mencionadas negarán la posibilidad de tener diferentes alias para diferentes caminos. También en aras de tener todas las diferentes caducidades de la memoria caché en un solo lugar, debe usar nginx map de la siguiente manera.

...

# Expires mappings
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     7d;
    ~image/                    max;
}

...

server {
   listen ...;

   expires $expires;
   location /assets/ {
      # It is now possible to serve some resources from different path
      alias /var/www/my_other_path/
   }

   # and have them all have same expirations
   location / {
       try_files $uri $uri/ /index.html;
   }
...
}

Offdeshabilita el almacenamiento en caché, epoch(para unix epoch) da como resultado que el recurso siempre se vuelva a buscar, maxestablece la fecha en el valor máximo del navegador.

~ Image / coincide con cualquier tipo de imagen.

Más información sobre los mapas nginx en http://nginx.org/en/docs/http/ngx_http_map_module.html .

Pantura
fuente
Tenga en cuenta que si $sent_http_content_typees "text/css;charset=UTF-8"la expresión anterior fallará.
pachanka
2

Si tiene un lugar que alberga todos sus archivos estáticos, algo como esto servirá ...

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

La respuesta aceptada hizo que nginx no encontrara ninguno de mis archivos estáticos. No estoy seguro de por qué, pero esta es una alternativa simple.

usuario161646
fuente
He votado por este pero asegúrese de agregar la /staticcarpeta (lo que haya establecido en la ubicación) al final del alias (justo después .../filesen el ejemplo).
Miro J.