Provide escaping for the ampersand in mod_rewrite diff -ur httpd-2.2.0/modules/mappers/mod_rewrite.c httpd-2.2.0.patched/modules/mappers/mod_rewrite.c --- httpd-2.2.0/modules/mappers/mod_rewrite.c 2005-11-10 07:20:05.000000000 -0800 +++ httpd-2.2.0.patched/modules/mappers/mod_rewrite.c 2006-02-04 13:52:34.000000000 -0800 @@ -1075,6 +1075,30 @@ return ap_escape_uri(r->pool, key); } +static char *rewrite_mapfunc_ampescape(request_rec *r, char *key) { + /* we only need to escape the ampersand */ + + unsigned char *copy = (char *)apr_palloc(r->pool, 3 * strlen(key) + 3); + const unsigned char *s = (const unsigned char *)key; + unsigned char *d = (unsigned char *)copy; + unsigned c; + + while ((c = *s)) { + if (c == '&') { + *d++ = '%'; + *d++ = '2'; + *d++ = '6'; + } else { + *d++ = c; + } + ++s; + } + *d = '\0'; + + return copy; +} + + static char *rewrite_mapfunc_unescape(request_rec *r, char *key) { ap_unescape_url(key); @@ -4011,6 +4035,7 @@ map_pfn_register("tolower", rewrite_mapfunc_tolower); map_pfn_register("toupper", rewrite_mapfunc_toupper); map_pfn_register("escape", rewrite_mapfunc_escape); + map_pfn_register("ampescape", rewrite_mapfunc_ampescape); map_pfn_register("unescape", rewrite_mapfunc_unescape); } return OK;