Puede RewriteCond Compruebe Edad archivo?

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Octubre 29th, 2010, 10:13 am

Me algunos han mod_rewrite directivas que busque en el directorio de caché para un archivo HTML estático antes de volver a escribir la solicitud de los archivos PHP de manejar. Esto funciona muy bien, pero si quiero actualizar mi caché periódicamente tengo que configurar una tarea de cron / automatizado de trabajo para eliminar los archivos de caché de la memoria caché para mod_rewrite no dio con una-f RewriteCond, sino que se salta el caché y regenera la página.

Lo que estoy preguntando es si puedo comprobar, tanto si existe un archivo a través de la opción-f, y de alguna manera comprobar que el archivo es menor que N horas de edad.
Strong with this one, the sudo is.
  • Anonymous
  • Bot
  • No Avatar
  • Registrado: 25 Feb 2008
  • Mensajes: ?
  • Loc: Ozzuland
  • Status: Online

Nota Octubre 29th, 2010, 10:13 am

  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de Usuario
  • Registrado: Feb 17, 2005
  • Mensajes: 1585
  • Status: Offline

Nota Noviembre 1st, 2010, 11:59 pm

No creo que su hombre sea posible. Sugiero ya sea para encontrar otro método o tal vez modificar mod_rewrite? Sé que es una mierda derecho...WTB servidor web con mejores mods.
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Noviembre 2nd, 2010, 4:50 am

Tomé una en el origen para mod_rewrite (módulos / mapeadores / mod_rewrite.c) y parece que no tendría demasiado difícil de añadir un pabellón especial RewriteCond para mi propósito. Sus problemas, probablemente más de su valor en el largo plazo, sin embargo.

Identificación probablemente tenga que empezar por agregar una nueva bandera para mi propósito.
Aquí está la enumeración. Adición de una bandera puede obligarme a volver a escribirlo si Apache añade una nueva bandera más tarde, y yo no sé cómo definir el exterior constante de la enumeración de una serie fuera de rango conflicto iba a salir.

C Código: [ Select ]
/* special pattern types for RewriteCond */
typedef enum {
    CONDPAT_REGEX = 0,
    CONDPAT_FILE_EXISTS, // -f flag
    CONDPAT_FILE_SIZE,
    CONDPAT_FILE_LINK,
    CONDPAT_FILE_DIR,
    CONDPAT_FILE_XBIT,
    CONDPAT_LU_URL,
    CONDPAT_LU_FILE,
    CONDPAT_STR_GT,
    CONDPAT_STR_LT,
    CONDPAT_STR_EQ
} pattern_type;
  1. /* special pattern types for RewriteCond */
  2. typedef enum {
  3.     CONDPAT_REGEX = 0,
  4.     CONDPAT_FILE_EXISTS, // -f flag
  5.     CONDPAT_FILE_SIZE,
  6.     CONDPAT_FILE_LINK,
  7.     CONDPAT_FILE_DIR,
  8.     CONDPAT_FILE_XBIT,
  9.     CONDPAT_LU_URL,
  10.     CONDPAT_LU_FILE,
  11.     CONDPAT_STR_GT,
  12.     CONDPAT_STR_LT,
  13.     CONDPAT_STR_EQ
  14. } pattern_type;


Luego Id tiene que ir hacia abajo y el trabajo de mi bandera en aquí.
Pude mantenerlo simple y sólo tiene que añadir una bandera de un carácter donde codificado en las 24 horas estoy buscando en este momento, pero que wouldnt ser muy útil.
a2 se define como "char * a2," anteriormente en la función, no estoy seguro de que podría sacar más bytes en que para poder agregar un intervalo de mi bandera o no.

C Código: [ Select ]
    /* determine the pattern type */
    newcond->ptype = CONDPAT_REGEX;
    if (*a2 && a2[1]) {
        if (!a2[2] && *a2 == '-') {
            switch (a2[1]) {
            case 'f': newcond->ptype = CONDPAT_FILE_EXISTS; break;
            case 's': newcond->ptype = CONDPAT_FILE_SIZE;   break;
            case 'l': newcond->ptype = CONDPAT_FILE_LINK;   break;
            case 'd': newcond->ptype = CONDPAT_FILE_DIR;    break;
            case 'x': newcond->ptype = CONDPAT_FILE_XBIT;   break;
            case 'U': newcond->ptype = CONDPAT_LU_URL;      break;
            case 'F': newcond->ptype = CONDPAT_LU_FILE;     break;
            }
        }
        else {
            switch (*a2) {
            case '>': newcond->ptype = CONDPAT_STR_GT; break;
            case '<': newcond->ptype = CONDPAT_STR_LT; break;
            case '=': newcond->ptype = CONDPAT_STR_EQ;
                /* "" represents an empty string */
                if (*++a2 == '"' && a2[1] == '"' && !a2[2]) {
                    a2 += 2;
                }
                break;
            }
        }
    }
  1.     /* determine the pattern type */
  2.     newcond->ptype = CONDPAT_REGEX;
  3.     if (*a2 && a2[1]) {
  4.         if (!a2[2] && *a2 == '-') {
  5.             switch (a2[1]) {
  6.             case 'f': newcond->ptype = CONDPAT_FILE_EXISTS; break;
  7.             case 's': newcond->ptype = CONDPAT_FILE_SIZE;   break;
  8.             case 'l': newcond->ptype = CONDPAT_FILE_LINK;   break;
  9.             case 'd': newcond->ptype = CONDPAT_FILE_DIR;    break;
  10.             case 'x': newcond->ptype = CONDPAT_FILE_XBIT;   break;
  11.             case 'U': newcond->ptype = CONDPAT_LU_URL;      break;
  12.             case 'F': newcond->ptype = CONDPAT_LU_FILE;     break;
  13.             }
  14.         }
  15.         else {
  16.             switch (*a2) {
  17.             case '>': newcond->ptype = CONDPAT_STR_GT; break;
  18.             case '<': newcond->ptype = CONDPAT_STR_LT; break;
  19.             case '=': newcond->ptype = CONDPAT_STR_EQ;
  20.                 /* "" represents an empty string */
  21.                 if (*++a2 == '"' && a2[1] == '"' && !a2[2]) {
  22.                     a2 += 2;
  23.                 }
  24.                 break;
  25.             }
  26.         }
  27.     }


Luego Id necesidad de trabajar a cabo el control de la edad del archivo aquí.
A primera vista, Id supongo que algo así como "sb.mtime" estará disponible a partir apr_stat.
No estoy seguro de cómo iba a acceder a mi intervalo de tiempo, aunque tal vez yo podría trabajar para que el analizador RewriteCond conjunto Ptype newcond-> a mi intervalo de una vez que se determinó que estaba usando.
Sin embargo, el intervalo sería necesario segundos para reducir las posibilidades de que conflicing con las demás constantes, sin embargo, apuesto a segundo sería el camino a seguir, ya que cualquier mtime devuelto es probable que sea una marca de tiempo UNIX. Sería fácil si el intervalo de ser segundos, y la fuerza de una restricción que ser mayor de 60 segundos para evitar que los conflictos sin embargo. Tal vez se han definido utilizando minutos, y luego convertirlo a segundos en el módulo.

C Código: [ Select ]
static int apply_rewrite_cond(rewritecond_entry *p, rewrite_ctx *ctx)
{
    char *input = do_expand(p->input, ctx, NULL);
    apr_finfo_t sb;
    request_rec *rsub, *r = ctx->r;
    ap_regmatch_t regmatch[AP_MAX_REG_MATCH];
    int rc = 0;
 
    switch (p->ptype) {
    case CONDPAT_FILE_EXISTS:
        if (   apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS
            && sb.filetype == APR_REG) {
            rc = 1;
        }
        break;
 
    case CONDPAT_FILE_SIZE:
        if (   apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS
            && sb.filetype == APR_REG && sb.size > 0) {
            rc = 1;
        }
        break;
 
  1. static int apply_rewrite_cond(rewritecond_entry *p, rewrite_ctx *ctx)
  2. {
  3.     char *input = do_expand(p->input, ctx, NULL);
  4.     apr_finfo_t sb;
  5.     request_rec *rsub, *r = ctx->r;
  6.     ap_regmatch_t regmatch[AP_MAX_REG_MATCH];
  7.     int rc = 0;
  8.  
  9.     switch (p->ptype) {
  10.     case CONDPAT_FILE_EXISTS:
  11.         if (   apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS
  12.             && sb.filetype == APR_REG) {
  13.             rc = 1;
  14.         }
  15.         break;
  16.  
  17.     case CONDPAT_FILE_SIZE:
  18.         if (   apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS
  19.             && sb.filetype == APR_REG && sb.size > 0) {
  20.             rc = 1;
  21.         }
  22.         break;
  23.  
Strong with this one, the sudo is.
  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de Usuario
  • Registrado: Feb 17, 2005
  • Mensajes: 1585
  • Status: Offline

Nota Noviembre 8th, 2010, 8:51 am

Has visto bien?

http://apr.apache.org/docs/apr/0.9/stru ... 5602a41c60
http://apr.apache.org/docs/apr/0.9/grou ... 0c55aa02bb (Microsegundos)

Wouldnt algo como esto funciona?

C Código: [ Select ]
     case CONDPAT_FILE_M_EXISTS:
       int mhours = 2;
         if (   apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS
             && sb.filetype == APR_REG && sb.mtime > ((time(NULL) - (mhours * 3600)) * 1000000) ) {
             rc = 1;
         }
         break;
 
  1.      case CONDPAT_FILE_M_EXISTS:
  2.        int mhours = 2;
  3.          if (   apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS
  4.              && sb.filetype == APR_REG && sb.mtime > ((time(NULL) - (mhours * 3600)) * 1000000) ) {
  5.              rc = 1;
  6.          }
  7.          break;
  8.  


¿Qué si no estoy equivocado mostraría el archivo existe, siempre y cuando no se modificó hace más de 2 horas.
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Registrado: Feb 10, 2004
  • Mensajes: 13458
  • Loc: Florida
  • Status: Offline

Nota Noviembre 8th, 2010, 9:51 am

Tengo la sensación de que en algún lugar allí, tal vez como miembro del grupo r-> o de entrada, los theres va a ser una marca de tiempo para la solicitud de que se podía acceder en lugar de trabajar con las rutinas de tiempo y matemáticas posteriores.

Definitivamente parece un inicio sin embargo. :D
Strong with this one, the sudo is.

Publicar Información

  • Total de mensajes en este tema: 5 mensajes
  • Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 203 invitados
  • No puede abrir nuevos temas en este Foro
  • No puede responder a temas en este Foro
  • No puede editar sus mensajes en este Foro
  • No puede borrar sus mensajes en este Foro
  • No puede enviar adjuntos en este Foro
 
 

© 2011 Unmelted, LLC. Ozzu® es una marca registrada de Unmelted, LLC