2009-08-23 24 views
7

Sé que podemos basar fácilmente un RewriteCond en cualquier http solicitud encabezado. ¿Pero podemos verificar (algunos) los encabezados de respuesta que se van a enviar? En particular, el Last-modified uno?mod_rewrite RewriteCond basado en Last-modified? (.htaccess)

Quiero reescribir una url solo cuando la fecha de Última modificación es anterior a 30 minutos y estoy tratando de evitar la sobrecarga de delegar esa verificación en un archivo php cada vez que se solicita un archivo de ese directorio.

¡Gracias de antemano!

Respuesta

0

Los encabezados de salida no existen hasta que much después de que mod_rewrite esté actuando. Tampoco hay ninguna función de comprobación de tiempo de modificación de archivos incorporada en mod_rewrite, por lo que lo más cerca que se utilizaría es crear un RewriteMap de la variedad del Programa de reescritura externa para averiguar si el archivo en cuestión se ha modificado.

Si entiendo su aplicación correctamente, también podría considerar tener un trabajo cron para eliminar archivos en ese directorio que tengan más de 30 minutos, y luego volver a escribir en una condición de inexistencia de archivos.

+0

Yeap, obviamente. Pero el encabezado Last-modified existe en ese momento, así que pensé que tal vez había algo para eso. Supongo que no hay :-( En cuanto al cron, eso es exactamente lo que trato de evitar. –

8

No, eso no es posible. Pero puede usar un rewrite map para obtener esa información de un programa con menos sobrecarga que PHP, tal vez un script de shell.

He aquí un ejemplo de script bash:

#!/usr/bin/env bash 
while read line; do 
    max_age=${line%%:*} 
    filename=${line#*:} 
    if [[ -f $filename ]]; then 
     lm=$(stat -f %m "$filename") 
     if [[ $(date +%s)-$lm -le $max_age ]]; then 
      echo yes 
     else 
      echo no 
     fi 
    else 
     echo no 
    fi 
done 

La declaración del mapa de reescritura tiene que ser colocado en su servidor o archivo configuraion máquina virtual ya que el programa se acaba de comenzar una vez y luego espera la entrada:

RewriteMap last-modified-within prg:/absolute/file/system/path/to/last-modified-within.sh 

Y a continuación, puede utilizar ese mapa de reescritura como esto (ejemplo .htaccess):

RewriteCond %{last-modified-within:30:%{REQUEST_FILENAME}} =yes 
RewriteRule ^foo/bar$ - [L] 
RewriteRule ^foo/bar$ script.php [L] 
+0

buena solución ya llegaste. –

+0

Dado que PHP ya está cargado y ejecutándose dentro del proceso de Apache, no está nada claro que generar un nuevo bash, uno por solicitud, será más rápido. Supongo que no es así. – derobert

+0

¡Guau, eso es inteligente! Muchas gracias por su tiempo. Sin embargo, ¿qué pasa con la objeción de derobert anterior? –

0

¿Ha considerado usar mod_proxy, mod_cache y/o squid? Parece que estás intentando rodar tu propio almacenamiento en caché ...

+0

Yeap, estoy tratando de almacenar en caché algunas imágenes generadas por php/gd y recrearlas cada 30 minutos, si es necesario (= si alguien realmente los solicita). ¿Crees que mod_proxy, mod_cache o squid pueden ayudar? Realmente nunca los he visto para ser francos. Siempre pensé que eran para cosas más complicadas. –

+0

Sí, estás haciendo caché web , y eso es exactamente para lo que están destinados. Naturalmente, solo debería preocuparse por esta optimización si es importante (por ejemplo, tiene el volumen de tráfico requerido). – derobert

Cuestiones relacionadas