Project

General

Profile

Bug #1600

proxy-core.rewrite-request never works (error in mod_proxy_core.c)

Added by chernousov over 11 years ago. Updated over 11 years ago.

Status:
Fixed
Priority:
Urgent
Assignee:
-
Category:
mod_proxy_core
Target version:
Start date:
Due date:
% Done:

0%

Estimated time:
Missing in 1.5.x:

Description

There is an error in mod_proxy_core.c, function proxy_get_request_header(). Function ends with code


if (i == p->conf.request_rewrites->used) {
    buffer_copy_string_buffer(sess->request_uri, con->request.uri);
}

This condition is always true because there is a loop before it:


for (i = 0; i < p->conf.request_rewrites->used; i++) {

Rewrites will be done in loop, but then sess->request_uri will be restored back from con->request.uri. No rewrites will work in result.


Related issues

Has duplicate Bug #1206: mod_proxy_core fails to rewrite proxy URL [fixed => ADD TO TRUNK!]Fixed

Actions

History

#1

Updated by Anonymous over 11 years ago

see this error also in my setup... should be fixed asap i think, cause i need to have mod_proxy_core with ajp and rewriting (frontend for a tomcat installation) and there seems to be no possibility atm...

-- bb

#2

Updated by Anonymous over 11 years ago

Replying to chernousov:

Rewrites will be done in loop, but then sess->request_uri will be restored back from con->request.uri. No rewrites will work in result.

This is incorrect. The rewrites of _scriptname and the like are taken care of here:


#!c
proxy_encode_request_headers(srv, sess, con->recv);

However, I traced this through with gdb and realized the problem: you must handle _pathinfo before _scriptname because otherwise con->uri.path will be overwritten with whatever value you have set for _scriptname as can be seen here:


#!c
} else if (buffer_is_equal_string(rw->header, CONST_STR_LEN("_scriptname"))) {
    int ret;

    if ((ret = pcre_replace(rw->regex, rw->replace, con->uri.path, p->replace_buf)) < 0) {
        switch (ret) {
        case PCRE_ERROR_NOMATCH:
        /* hmm, ok. no problem */
        break;
        default:
        TRACE("oops, pcre_replace failed with: %d", ret);
        break;
        }
    } else {
        /* we matched, cool. */
        buffer_copy_string_buffer(con->uri.path, p->replace_buf);
    }
}

For now, the following should work around this bug (use appropriate regex of course):


proxy-core.rewrite-request = (
  "_pathinfo" => ( "(.*)" => "$1"),
  "_scriptname" => ( ".*" => "/")
)

-- osmaker+lighttpd

#3

Updated by chernousov over 11 years ago

I'm talking about rewriting of _uri.

#4

Updated by hoffie over 11 years ago

Everything except _uri worked fine for me. I'm not able to see how the code is supposed to work, I'm attaching a patch which makes _uri work for me, but I fear it might break something else. Any testing/review appreciated. :)

#5

Updated by hoffie over 11 years ago

This one can be closed imo, as the patch was committed in r2146. Patch works still fine for me and did not break any other rewrite stuff. There were also some success reports in #lighttpd.

#6

Updated by hoffie over 11 years ago

  • Status changed from New to Fixed
  • Resolution set to fixed

Also available in: Atom