Peut RewriteCond Vérifiez Âge fichier?

  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Octobre 29th, 2010, 10:13 am

J'ai quelques directives que mod_rewrite vérifier un répertoire cache d'un fichier HTML statique avant de le réécrire la demande pour les fichiers PHP à manipuler. Cela fonctionne très bien, mais si je veux mettre à jour mon cache périodiquement je dois configurer un cron / automatisé tâche de supprimer les fichiers du cache de sorte mod_rewrite ne frappe pas sur un f-RewriteCond, mais saute au lieu de la cache et régénère la page.

Qu'est-ce Im se demandant, est de savoir si je peux vérifier à la fois si un fichier existe via l'option-f, et en quelque sorte vérifier que le fichier est inférieur à N heures vieux.
Strong with this one, the sudo is.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Octobre 29th, 2010, 10:13 am

  • PolishHurricane
  • Mastermind
  • Mastermind
  • Avatar de l’utilisateur
  • Inscription: Fév 17, 2005
  • Messages: 1585
  • Status: Offline

Message Novembre 1st, 2010, 11:59 pm

Je ne pense pas que son homme possible. Je propose soit de trouver une autre méthode ou peut-être modifier mod_rewrite? Je sais ça craint droit...serveur web WTB nouvelle avec un meilleur mods.
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Novembre 2nd, 2010, 4:50 am

J'ai pris un à la source pour mod_rewrite (modules / mappeurs / mod_rewrite.c) et il semble qu'il wouldnt être trop difficile d'ajouter un drapeau spécial RewriteCond pour mon but. Ses ennuis sans doute plus de sa valeur sur le long terme si.

Id probablement commencer par ajouter un nouveau drapeau pour mon but.
Heres l'énumération. Ajout d'un indicateur pourrait me forcer à le réécrire si Apache ajoute un nouveau drapeau, plus tard, et je ne sais pas comment définir l'extérieur constante de l'énumération d'un certain nombre hors de portée des conflits s'arrangerait.

C Code: [ 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;


Puis Id de sauter vers le bas et le travail de mon drapeau dans ici.
Je pourrais rester simple et il suffit d'ajouter un drapeau d'un caractère où il en dur dans les 24 heures Je cherche pour le moment, mais que wouldnt être très utile.
a2 est défini comme «char * A2;" plus tôt dans la fonction, Je ne suis pas sûr que j'aurais pu tirer plus de bytes dans ce que je puisse ajouter un délai à mon drapeau ou non.

C Code: [ 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.     }


Puis Id nécessité de travailler à la vérification de l'âge du fichier ici.
À première vue, Id deviner que quelque chose comme "sb.mtime" serait disponible à partir apr_stat.
Je ne suis pas sûr de savoir comment je accéder à mon intervalle, quoique peut-être je pourrais le travail de telle sorte que l'analyseur RewriteCond ensemble PType newcond-> à mon intervalle une fois qu'il a déterminé qu'il était de l'utiliser.
Bien que, l'intervalle devrait être secondes pour réduire les chances de conflicing avec les autres constantes, encore, je parie seconde serait la voie à suivre car tout mtime retournée est susceptible d'être un timestamp UNIX. Il serait maladroit d'avoir l'intervalle de prendre plusieurs secondes, et la force d'une restriction que ce soit de plus de 60 secondes pour prévenir les conflits bien. Peut-être ont-elle être définie en utilisant minutes, puis le convertir en secondes dans le module.

C Code: [ 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 l’utilisateur
  • Inscription: Fév 17, 2005
  • Messages: 1585
  • Status: Offline

Message Novembre 8th, 2010, 8:51 am

Youve vu ce droit?

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

quelque chose comme Wouldnt ce travail?

C Code: [ 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.  


Qui, si Im ne me trompe pas se voir le fichier existe tant qu'il n'a pas été modifiée à plus de 2 heures auparavant.
There's no place like 127.0.0.1, badass part is now it's ::1
  • joebert
  • Sledgehammer
  • Genius
  • No Avatar
  • Inscription: Fév 10, 2004
  • Messages: 13455
  • Loc: Florida
  • Status: Offline

Message Novembre 8th, 2010, 9:51 am

J'ai le sentiment que quelque part là-dedans, peut-être en tant que membre du pool r-> ou l'entrée, theres va être un timestamp de la demande qui pourrait être consulté au lieu de travailler avec les routines du temps et de mathématiques ultérieurs.

ressemble vraiment à un début si. :D
Strong with this one, the sudo is.

Afficher de l'information

  • Total des messages de ce sujet: 5 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 170 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC