2012-04-26 13 views
5

¡Hola!htaccess - reescritura condicional y vencimiento

Tengo una carpeta /static en mi webroot del servidor Apache 2.x. Si una petición coincide con

/static/<somename like [\S-_]+>.(png|jpg|css|js)/\d{8,15} 

por ejemplo

/static/bg.jpg/1335455634 

Quiero dos cosas:

  • url será reescrita para /static/bg.jpg (deshacerse de la marca de tiempo)
  • , que se convertirá a never-expire ('expira 2030, max-age = 290304000, caché pública, ...)

Si la solicitud no coincide, la solicitud y sus encabezados deben ser normales, sin reescribir. Idealmente, cualquier solicitud fuera/static/* no debería verse afectada (aunque las "marcas de tiempo de coincidencia coincidentes" deberían ser raras ...)

No tengo más que problemas con FilesMatch/RewriteCond, por lo que prefiero no publicar mis intentos fallidos. .. (Reescribir en genereal está habilitado en mi máquina, y yo sí tengo el derecho de enviar encabezados relacionados con caché)

Dankeschön!

Respuesta

2

¿Qué tal algo así?

RewriteEngine on 
RewriteRule ^static/([^/]+\.(png|jpg|css|js))x?/\d{8,15}$ /static/$1 [NC,L] 

<FilesMatch "\.(png|jpg|css|js)$"> 
    <IfModule mod_expires.c> 
     ExpiresActive On 
    </IfModule> 
    <IfModule mod_headers.c> 
     ExpiresDefault "access plus 10 years" 
    </IfModule> 
</FilesMatch> 
+0

Gracias. Yo * lo veré * y lo probaré. Le pido paciencia por otros 2-3 días. –

+0

No hay problema. Feliz de ayudar. Por cierto, esta es una herramienta muy útil para probar las reglas de htaccess - http://htaccess.madewithlove.be/ – jesal

+0

Gracias. Su solución, respectivamente, ambas soluciones funcionan. Sin embargo, una cosa parece imposible: que los archivos no reescritos reciban una caducidad regular y que solo los archivos reescritos obtengan la caducidad. FilesMatch parece preocuparse solo por el archivo finalmente abierto, nada de lo que sucede antes. Independientemente de si se coloca por encima o por debajo de la regla de reescritura. En otras palabras, todos los jpgs, pngs ahora se vuelven nunca caducan. Así que incluso si voy por 'static/simple.jpgx/123456789' (es por eso que temporalmente me quedé atrapado en' x? '), Se empareja. –

4
Options +FollowSymLinks -MultiViews 
# Turn mod_rewrite on 
RewriteEngine On 
RewriteBase/

RewriteRule ^static/([^.]+\.(png|jpe?g|css|js))/\d{8,15}$ static/$1 [L,R,NC] 

# now set expire date to today + 1 year 
<IfModule mod_expires.c> 
    ExpiresActive on 
    ExpiresByType image/jpeg "access plus 1 years" 
    ExpiresByType image/png "access plus 1 years" 
    ExpiresByType text/css "access plus 1 years" 
    ExpiresByType text/js "access plus 1 years" 
    ExpiresByType text/javascript "access plus 1 years" 
    ExpiresByType application/javascript "access plus 1 years" 
    ExpiresByType application/x-javascript "access plus 1 years" 
</IfModule> 

he elegido iccess plus 1 years para nunca expira porque me encontré en la web:

"Para marcar una respuesta como 'nunca caduca', un servidor de origen envía un Vence la fecha aproximadamente un año desde el momento en que se envió la respuesta . Los servidores HTTP/1.1 NO DEBEN enviar fechas de caducidad más de un año en el futuro ".

Desde el RFC HTTP 1.1

+0

Gracias, también. Véase más arriba. –

+0

Funciona bien para mí, me pregunto si también debería agregar .gif allí ... – adrianTNT

+0

Sí, puede agregar '.gif' también. – anubhava

Cuestiones relacionadas