summaryrefslogtreecommitdiff
path: root/src/mod_redirect.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mod_redirect.c')
-rw-r--r--src/mod_redirect.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/mod_redirect.c b/src/mod_redirect.c
index 24523ca..d5f7864 100644
--- a/src/mod_redirect.c
+++ b/src/mod_redirect.c
@@ -215,8 +215,7 @@ static handler_t mod_redirect_uri_handler(server *srv, connection *con, void *p_
start = 0; end = pattern_len;
for (k = 0; k < pattern_len; k++) {
- if ((pattern[k] == '$' || pattern[k] == '%') &&
- isdigit((unsigned char)pattern[k + 1])) {
+ if (pattern[k] == '$' || pattern[k] == '%') {
/* got one */
size_t num = pattern[k + 1] - '0';
@@ -225,7 +224,10 @@ static handler_t mod_redirect_uri_handler(server *srv, connection *con, void *p_
buffer_append_string_len(p->location, pattern + start, end - start);
- if (pattern[k] == '$') {
+ if (!isdigit((unsigned char)pattern[k + 1])) {
+ /* enable escape: "%%" => "%", "%a" => "%a", "$$" => "$" */
+ buffer_append_string_len(p->location, pattern+k, pattern[k] == pattern[k+1] ? 1 : 2);
+ } else if (pattern[k] == '$') {
/* n is always > 0 */
if (num < (size_t)n) {
buffer_append_string(p->location, list[num]);
@@ -251,6 +253,7 @@ static handler_t mod_redirect_uri_handler(server *srv, connection *con, void *p_
response_header_insert(srv, con, CONST_STR_LEN("Location"), CONST_BUF_LEN(p->location));
con->http_status = 301;
+ con->mode = DIRECT;
con->file_finished = 1;
return HANDLER_FINISHED;