rse         99/01/01 11:50:24

  Modified:    src      CHANGES
               src/modules/standard mod_rewrite.c mod_rewrite.h
               htdocs/manual/mod mod_rewrite.html
  Log:
  Two minor enhancements to mod_rewrite: First RewriteRule now also supports the
  ``nocase|NC'' flag (as RewriteCond already does for ages) to match case
  insensitive (this especially avoids nasty patterns like `[tT][eE][sS][tT]').
  Second two additional internal map functions `escape' and `unescape' were
  added which can be used to escape/unescape to/from hex-encodings in URLs parts
  (this is especially useful in combination with map lookups).
  
  Submitted by: Magnus Bodin, Ian Kallen
  Integrated and fixed by: Ralf S. Engelschall
  
  Revision  Changes    Path
  1.1187    +9 -0      apache-1.3/src/CHANGES
  
  Index: CHANGES
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/CHANGES,v
  retrieving revision 1.1186
  retrieving revision 1.1187
  diff -u -r1.1186 -r1.1187
  --- CHANGES   1999/01/01 17:17:54     1.1186
  +++ CHANGES   1999/01/01 19:50:20     1.1187
  @@ -1,5 +1,14 @@
   Changes with Apache 1.3.4
    
  +  *) Two minor enhancements to mod_rewrite: First RewriteRule now also
  +     supports the ``nocase|NC'' flag (as RewriteCond already does for ages) 
to
  +     match case insensitive (this especially avoids nasty patterns like
  +     `[tT][eE][sS][tT]'). Second two additional internal map functions
  +     `escape' and `unescape' were added which can be used to escape/unescape
  +     to/from hex-encodings in URLs parts (this is especially useful in
  +     combination with map lookups). 
  +     [Magnus Bodin, Ian Kallen, Ralf S. Engelschall]
  +
     *) Renamed the macro escape_uri() to ap_escape_uri() which was
        forgotten (because it was a macro) in the symbol renaming process.
        [Ralf S. Engelschall]
  
  
  
  1.135     +46 -14    apache-1.3/src/modules/standard/mod_rewrite.c
  
  Index: mod_rewrite.c
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_rewrite.c,v
  retrieving revision 1.134
  retrieving revision 1.135
  diff -u -r1.134 -r1.135
  --- mod_rewrite.c     1999/01/01 19:05:12     1.134
  +++ mod_rewrite.c     1999/01/01 19:50:22     1.135
  @@ -501,6 +501,12 @@
           else if (strcmp(a2+4, "toupper") == 0) {
               new->func = rewrite_mapfunc_toupper;
           }
  +        else if (strcmp(a2+4, "escape") == 0) {
  +            new->func = rewrite_mapfunc_escape;
  +        }
  +        else if (strcmp(a2+4, "unescape") == 0) {
  +            new->func = rewrite_mapfunc_unescape;
  +        }
           else if (sconf->state == ENGINE_ENABLED) {
               return ap_pstrcat(cmd->pool, "RewriteMap: internal map not 
found:",
                                 a2+4, NULL);
  @@ -708,6 +714,7 @@
       char *a3;
       char *cp;
       const char *err;
  +    int mode;
   
       sconf = (rewrite_server_conf *)
               ap_get_module_config(cmd->server->module_config, 
&rewrite_module);
  @@ -726,16 +733,32 @@
                             "'\n", NULL);
       }
   
  +    /* arg3: optional flags field */
  +    new->forced_mimetype     = NULL;
  +    new->forced_responsecode = HTTP_MOVED_TEMPORARILY;
  +    new->flags  = RULEFLAG_NONE;
  +    new->env[0] = NULL;
  +    new->skip   = 0;
  +    if (a3 != NULL) {
  +        if ((err = cmd_rewriterule_parseflagfield(cmd->pool, new,
  +                                                  a3)) != NULL) {
  +            return err;
  +        }
  +    }
  +
       /*  arg1: the pattern
        *  try to compile the regexp to test if is ok
        */
  -    new->flags = RULEFLAG_NONE;
       cp = a1;
       if (cp[0] == '!') {
           new->flags |= RULEFLAG_NOTMATCH;
           cp++;
       }
  -    if ((regexp = ap_pregcomp(cmd->pool, cp, REG_EXTENDED)) == NULL) {
  +    mode = REG_EXTENDED;
  +    if (new->flags & RULEFLAG_NOCASE) {
  +        mode |= REG_ICASE;
  +    }
  +    if ((regexp = ap_pregcomp(cmd->pool, cp, mode)) == NULL) {
           return ap_pstrcat(cmd->pool,
                             "RewriteRule: cannot compile regular expression '",
                             a1, "'\n", NULL);
  @@ -749,18 +772,6 @@
        */
       new->output = ap_pstrdup(cmd->pool, a2);
   
  -    /* arg3: optional flags field */
  -    new->forced_mimetype = NULL;
  -    new->forced_responsecode = HTTP_MOVED_TEMPORARILY;
  -    new->env[0] = NULL;
  -    new->skip = 0;
  -    if (a3 != NULL) {
  -        if ((err = cmd_rewriterule_parseflagfield(cmd->pool, new,
  -                                                  a3)) != NULL) {
  -            return err;
  -        }
  -    }
  -
       /* now, if the server or per-dir config holds an
        * array of RewriteCond entries, we take it for us
        * and clear the array
  @@ -917,6 +928,10 @@
                || strcasecmp(key, "QSA") == 0   ) {
           cfg->flags |= RULEFLAG_QSAPPEND;
       }
  +    else if (   strcasecmp(key, "nocase") == 0
  +             || strcasecmp(key, "NC") == 0    ) {
  +        cfg->flags |= RULEFLAG_NOCASE;
  +    }
       else {
           return ap_pstrcat(p, "RewriteRule: unknown flag '", key, "'\n", 
NULL);
       }
  @@ -2964,6 +2979,23 @@
            cp++) {
           *cp = ap_tolower(*cp);
       }
  +    return value;
  +}
  +
  +static char *rewrite_mapfunc_escape(request_rec *r, char *key)
  +{
  +    char *value;
  +
  +    value = ap_escape_uri(r->pool, key);
  +    return value;
  +}
  +
  +static char *rewrite_mapfunc_unescape(request_rec *r, char *key)
  +{
  +    char *value;
  +
  +    value = ap_pstrdup(r->pool, key);
  +    ap_unescape_url(value);
       return value;
   }
   
  
  
  
  1.59      +3 -0      apache-1.3/src/modules/standard/mod_rewrite.h
  
  Index: mod_rewrite.h
  ===================================================================
  RCS file: /home/cvs/apache-1.3/src/modules/standard/mod_rewrite.h,v
  retrieving revision 1.58
  retrieving revision 1.59
  diff -u -r1.58 -r1.59
  --- mod_rewrite.h     1999/01/01 19:05:12     1.58
  +++ mod_rewrite.h     1999/01/01 19:50:22     1.59
  @@ -202,6 +202,7 @@
   #define RULEFLAG_FORBIDDEN          1<<9
   #define RULEFLAG_GONE               1<<10
   #define RULEFLAG_QSAPPEND           1<<11
  +#define RULEFLAG_NOCASE             1<<12
   
   #define MAPTYPE_TXT                 1<<0
   #define MAPTYPE_DBM                 1<<1
  @@ -427,6 +428,8 @@
                                    char *key);
   static char *rewrite_mapfunc_toupper(request_rec *r, char *key);
   static char *rewrite_mapfunc_tolower(request_rec *r, char *key);
  +static char *rewrite_mapfunc_escape(request_rec *r, char *key);
  +static char *rewrite_mapfunc_unescape(request_rec *r, char *key);
   static char *select_random_value_part(request_rec *r, char *value);
   static void  rewrite_rand_init(void);
   static int   rewrite_rand(int l, int h);
  
  
  
  1.41      +9 -0      apache-1.3/htdocs/manual/mod/mod_rewrite.html
  
  Index: mod_rewrite.html
  ===================================================================
  RCS file: /home/cvs/apache-1.3/htdocs/manual/mod/mod_rewrite.html,v
  retrieving revision 1.40
  retrieving revision 1.41
  diff -u -r1.40 -r1.41
  --- mod_rewrite.html  1998/11/09 16:44:08     1.40
  +++ mod_rewrite.html  1999/01/01 19:50:23     1.41
  @@ -751,6 +751,10 @@
           Converts the looked up key to all upper case.
       <LI><STRONG>tolower</STRONG>:<BR>
           Converts the looked up key to all lower case.
  +    <LI><STRONG>escape</STRONG>:<BR>
  +        Translates special characters in the looked up key to hex-encodings.
  +    <LI><STRONG>unescape</STRONG>:<BR>
  +        Translates hex-encodings in the looked up key back to special 
characters.
       </UL>
   <P>
   <LI><STRONG>External Rewriting Program</STRONG><BR>
  @@ -1584,6 +1588,11 @@
       with CGI-scripts to force them to be processed by the CGI-script, the
       chance is high that you will run into problems (or even overhead) on 
sub-requests.
       In these cases, use this flag.
  +<P>
  +<LI>'<STRONG><CODE>nocase|NC</CODE></STRONG>' (<STRONG>n</STRONG>o 
<STRONG>c</STRONG>ase)<BR>
  +     This makes the <EM>Pattern</EM> case-insensitive, <EM>i.e.</EM>, there 
is
  +     no difference between 'A-Z' and 'a-z' when <EM>Pattern</EM> is matched
  +     against the current URL.
   <P>
   <LI>'<STRONG><CODE>qsappend|QSA</CODE></STRONG>' (<STRONG>q</STRONG>uery 
<STRONG>s</STRONG>tring
       <STRONG>a</STRONG>ppend)<BR> 
  
  
  

Reply via email to