ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: error_page with query_string



On Tue, Apr 22, 2008 at 10:46:53PM +0300, Andrew Sitnikov wrote:

> Hello nginx-ru,
> 
>   fastcgi_intercept_errors on;
> 
>   error_page 404 /index.php?autocom=errordoc&CODE=404
> 
>   первый запрос возвращяет 404, второй запрос на уходит на backend,
>   и опять получается 404. мне кажется что $fastcgi_script_name получается 
> равным '/index.php?autocom=errordoc&CODE=404'
>   потому что если руками вбить линк этот то показывается нужная страница.
> 
>   версия nginx/0.5.35

Прилагаемый патч должен исправить.


-- 
Игорь Сысоев
http://sysoev.ru
Index: src/http/ngx_http_core_module.c
===================================================================
--- src/http/ngx_http_core_module.c     (revision 1295)
+++ src/http/ngx_http_core_module.c     (working copy)
@@ -3471,6 +3471,7 @@
 {
     ngx_http_core_loc_conf_t *lcf = conf;
 
+    u_char                     *args;
     ngx_int_t                   overwrite;
     ngx_str_t                  *value, uri;
     ngx_uint_t                  i, n, nvar;
@@ -3539,6 +3540,8 @@
         }
     }
 
+    args = (u_char *) ngx_strchr(uri.data, '?');
+
     for (i = 1; i < cf->args->nelts - n; i++) {
         err = ngx_array_push(lcf->error_pages);
         if (err == NULL) {
@@ -3577,7 +3580,19 @@
             }
         }
 
-        err->uri = uri;
+        if (args) {
+            err->uri.len = args - uri.data;
+            err->uri.data = uri.data;
+            args++;
+            err->args.len = (uri.data + uri.len) - args;
+            err->args.data = args;
+
+        } else {
+            err->uri = uri;
+            err->args.len = 0;
+            err->args.data = NULL;
+        }
+
         err->uri_lengths = uri_lengths;
         err->uri_values = uri_values;
     }
Index: src/http/ngx_http_special_response.c
===================================================================
--- src/http/ngx_http_special_response.c        (revision 1295)
+++ src/http/ngx_http_special_response.c        (working copy)
@@ -441,8 +441,6 @@
 
     r->zero_in_uri = 0;
 
-    args = NULL;
-
     if (err_page->uri_lengths) {
         if (ngx_http_script_run(r, &u, err_page->uri_lengths->elts, 0,
                                 err_page->uri_values->elts)
@@ -453,6 +451,7 @@
 
         p = u.data;
         uri = &u;
+        args = NULL;
 
         if (*p == '/') {
 
@@ -488,6 +487,7 @@
 
     } else {
         uri = &err_page->uri;
+        args = &err_page->args;
     }
 
     if (uri->data[0] == '/') {
Index: src/http/ngx_http_core_module.h
===================================================================
--- src/http/ngx_http_core_module.h     (revision 1295)
+++ src/http/ngx_http_core_module.h     (working copy)
@@ -225,6 +225,7 @@
     ngx_int_t                  status;
     ngx_int_t                  overwrite;
     ngx_str_t                  uri;
+    ngx_str_t                  args;
     ngx_array_t               *uri_lengths;
     ngx_array_t               *uri_values;
 } ngx_http_err_page_t;


 




Copyright © Lexa Software, 1996-2009.