Rewrite problem after upgrade to 0.6.29

Hi all,

Sorry if this issue had been reported before but this one is my first
week in the list.

We have upgraded from NGINX 0.6.25 to 0.6.29 and we have a big problem
with our rewrite rules.

For this trial, our configuration was very simple:

  • Port 80: NGINX.
  • Port 81: Apache with PHP.
  • Queries: user <==> NGINX <==> Apache.
  • A PHP script (news.html) which contains: <?php echo $_REQUEST['id']; ?>

A simple rewrite rule:

location ^~ /news/ {
proxy_pass http://127.0.0.1:81/;
[…]
rewrite ^/news/([^/]+)/?$ /news.html?id=$1 break;
}

So, with 0.6.25, when i send the query ‘http://127.0.0.1/news/one%20two
what the Apache receive is:

127.0.0.1 […] “GET /news.html?id=one%20two HTTP/1.0” 200 7

So, we get ‘one two’ from the PHP. Great :).

When we send the same query to 0.6.29, Apache gets:

127.0.0.1 […] “GET /news.html?id=one two HTTP/1.0” 200 3

Oopppss! So PHP output is ‘one’. But the real problem is the
“/news.html?id=one two” query. With spaces! :frowning:

I located the problem inside ‘ngx_http_script.c’ file, if I changed …

@@ -512,7 +504,7 @@
e->ip += sizeof(ngx_http_script_copy_capture_code_t);

  if (code->n < e->ncaptures) {
  •    if ((e->is_args || e->quote)
    
  •    if ((e->args || e->quote)
            && (e->request->quoted_uri || e->request->plus_in_uri))
        {
            return e->captures[code->n + 1] - e->captures[code->n]
    

@@ -539,7 +531,7 @@
e->ip += sizeof(ngx_http_script_copy_capture_code_t);

  if (code->n < e->ncaptures) {
  •    if ((e->is_args || e->quote)
    
  •    if ((e->args || e->quote)
            && (e->request->quoted_uri || e->request->plus_in_uri))
        {
            e->pos = (u_char *) ngx_escape_uri(e->pos,
    

… everything goes fine again. But there are more changes to that file
so i don’t know if colateral effects.

Any idea? A bug?

Regards,