From 7b16ebc72f5928f0eb7aabcb460b20d03072253c Mon Sep 17 00:00:00 2001 From: Alexey Berezhok Date: Fri, 26 Jun 2026 01:03:37 +0300 Subject: [PATCH] Fixed pass parameter on redirect --- .../ngx_http_apache_rewrite_engine.c | 55 ++++++++++++++++--- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/modules/mod_rewrite/ngx_http_apache_rewrite_engine.c b/modules/mod_rewrite/ngx_http_apache_rewrite_engine.c index 755a650..c0b8499 100644 --- a/modules/mod_rewrite/ngx_http_apache_rewrite_engine.c +++ b/modules/mod_rewrite/ngx_http_apache_rewrite_engine.c @@ -479,12 +479,11 @@ ngx_rewrite_apply_rule(ngx_rewrite_rule_t *rule, ngx_rewrite_ctx_t *ctx, ngx_str "mod_rewrite: rewrite \"%V\" -> \"%V\" (flags=0x%xd, code=%d)", &ctx->uri, &newuri, rule->flags, rule->forced_responsecode); - /* Split out query string */ - { - ngx_str_t new_args = r->args; - ngx_rewrite_splitout_queryargs(r, &newuri, rule->flags, &new_args); - r->args = new_args; - } + + ngx_str_t new_args = r->args; + ngx_rewrite_splitout_queryargs(r, &newuri, rule->flags, &new_args); + r->args = new_args; + /* Check for absolute URI → redirect */ if (rule->flags & RULEFLAG_FORCEREDIRECT) { @@ -539,7 +538,7 @@ ngx_rewrite_apply_rule(ngx_rewrite_rule_t *rule, ngx_rewrite_ctx_t *ctx, ngx_str } } - len = scheme.len + 3 + host.len + newuri.len + 3; + len = scheme.len + 3 + host.len + newuri.len + 3 + new_args.len + 2; if (port) { len += 6; /* :NNNNN */ } @@ -568,6 +567,10 @@ ngx_rewrite_apply_rule(ngx_rewrite_rule_t *rule, ngx_rewrite_ctx_t *ctx, ngx_str *p++ = '/'; } p = ngx_cpymem(p, newuri.data, newuri.len); + if (new_args.len > 0) { + *p++ = '?'; + p = ngx_cpymem(p, new_args.data, new_args.len); + } newuri.data = start; newuri.len = p - start; } @@ -587,8 +590,31 @@ ngx_rewrite_apply_rule(ngx_rewrite_rule_t *rule, ngx_rewrite_ctx_t *ctx, ngx_str } ctx->redirect_url = newuri; + + /* Append old query args if present */ + if (new_args.len > 0 && ctx->redirect_url.data != NULL && ctx->redirect_url.len > 0) { + u_char *tmp_data; + size_t combined_len = ctx->redirect_url.len + 1 + new_args.len; + tmp_data = ngx_pnalloc(r->pool, combined_len); + if (tmp_data) { + ngx_memcpy(tmp_data, ctx->redirect_url.data, ctx->redirect_url.len); + *tmp_data++ = '&'; + ngx_memcpy(tmp_data, new_args.data, new_args.len); + ctx->redirect_url.data = tmp_data; + ctx->redirect_url.len = combined_len; + } + } + ctx->redirect_code = code; + /* Update URI to include appended args (for subsequent processing) */ ctx->uri = newuri; + if (ctx->redirect_url.len > 0 && ctx->redirect_url.data != NULL + && ngx_strcmp(ctx->uri.data, ctx->redirect_url.data) != 0) { + /* redirect_url has more data (args appended), copy it */ + ctx->uri.data = ctx->redirect_url.data; + ctx->uri.len = ctx->redirect_url.len; + } + return RULE_RC_MATCH; } @@ -628,6 +654,21 @@ ngx_rewrite_apply_rule(ngx_rewrite_rule_t *rule, ngx_rewrite_ctx_t *ctx, ngx_str } ctx->uri = newuri; + + /* Append old query args to URI if present and redirect_url wasn't modified */ + if (new_args.len > 0 && ctx->redirect_url.data == NULL + && ctx->uri.data != NULL && ctx->uri.len > 0) { + u_char *tmp_data; + size_t combined_len = ctx->uri.len + 1 + new_args.len; + tmp_data = ngx_pnalloc(r->pool, combined_len); + if (tmp_data) { + ngx_memcpy(tmp_data, ctx->uri.data, ctx->uri.len); + *tmp_data++ = '&'; + ngx_memcpy(tmp_data, new_args.data, new_args.len); + ctx->uri.data = tmp_data; + ctx->uri.len = combined_len; + } + } ngx_str_null(&ctx->redirect_url); ctx->redirect_code = 0;