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.
/* 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;
- /* 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;
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.
/* 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;
}
}
}
- /* 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;
- }
- }
- }
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.
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;
- 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;
-
Strong with this one, the sudo is.