error_page and log_not_found in nginx 0.7.8

Igor Sysoev is at rambler-co.ru
Thu Aug 14 17:05:20 MSD 2008


On Tue, Aug 12, 2008 at 12:58:03PM +0200, Steffen Weber wrote:

> Igor Sysoev wrote:
> >On Mon, Aug 11, 2008 at 10:20:36AM +0200, Steffen Weber wrote:
> >
> >>I think I'm either misunderstanding the purpose of the log_not_found 
> >>directive or maybe there is a bug in nginx 0.7.8. In May 2008 Igor 
> >>recommended [1] the following configuration snippet to hand off all 
> >>requests for non-existing files to PHP:
> >>
> >>location / {
> >>    error_page 404 = /index.php;
> >>}
> >>
> >>But this creates an entry in my error_log for each request that is 
> >>handed off to PHP. Michael Shadle then pointed me to the log_not_found 
> >>directive, but adding "log_not_found off;" to the configuration file 
> >>does not seem to have any effect, no matter where I put it (http, server 
> >>or location block).
> >>
> >>The error I get originates from src/http/modules/ngx_http_index_module.c 
> >>and reads
> >>
> >>2008/08/11 10:04:17 [error] 5887#0: *1 "/doc/root/artikel/index.php" is 
> >>not found (2: No such file or directory), client: 127.0.0.1, server: 
> >>www.example.org, request: "GET /artikel/ HTTP/1.1", host: 
> >>"www.example.org", referrer: "http://www.example.org/"
> >>
> >>What am I doing wrong?
> >>
> >>I could, of course, change the error_log directive to only log critical 
> >>events, but I fear that I would miss some (more) important errors then.
> >
> >The attached patch should fix the bug.
> 
> I still have one problem when using this method: First I noticed that 
> the redirected requests were missing the GET data, but I was able to 
> solve this problem by using
> 
> error_page 404 = /index.php?$args;
> 
> instead of
> 
> error_page 404 = /index.php;
> 
> But POST data is missing, too. At least the $_POST array in PHP is empty 
> when the request is redirected by the error_page directive. However, the 
> cookies somehow make it through. How can I solve this problem?
> 
> I have reverted to the following configuration for now:
> 
> if (-f $request_filename) {
>     break;
> }
> rewrite ^ /index.php last;

Try the attached patch. The POST method will be changed to GET while
internal redirection, but the POST body will remain. Probably $_POST
array will contain the body data.


-- 
Igor Sysoev
http://sysoev.ru/en/
-------------- next part --------------
Index: src/http/modules/ngx_http_static_module.c
===================================================================
--- src/http/modules/ngx_http_static_module.c	(revision 1499)
+++ src/http/modules/ngx_http_static_module.c	(working copy)
@@ -58,7 +58,7 @@
     ngx_open_file_info_t       of;
     ngx_http_core_loc_conf_t  *clcf;
 
-    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {
+    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD|NGX_HTTP_POST))) {
         return NGX_HTTP_NOT_ALLOWED;
     }
 
@@ -71,10 +71,13 @@
         return NGX_DECLINED;
     }
 
-    rc = ngx_http_discard_request_body(r);
+    if (r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD)) {
 
-    if (rc != NGX_OK) {
-        return rc;
+        rc = ngx_http_discard_request_body(r);
+
+        if (rc != NGX_OK) {
+            return rc;
+        }
     }
 
     log = r->connection->log;
@@ -203,6 +206,10 @@
 
 #endif
 
+    if (r->method & NGX_HTTP_POST) {
+        return NGX_HTTP_NOT_ALLOWED;
+    }
+
     log->action = "sending response to client";
 
     r->headers_out.status = NGX_HTTP_OK;


More information about the nginx mailing list