atom feed6 messages in ru.sysoev.nginxRe: error_page and log_not_found in n...
FromSent OnAttachments
Steffen WeberAug 11, 2008 1:20 am 
Igor SysoevAug 11, 2008 4:27 am.Other
Steffen WeberAug 11, 2008 8:05 am 
Steffen WeberAug 12, 2008 3:57 am 
mikeAug 12, 2008 9:44 am 
Igor SysoevAug 14, 2008 6:04 am.Other
Subject:Re: error_page and log_not_found in nginx 0.7.8
From:Steffen Weber (ngin@public.gmane.org)
Date:Aug 12, 2008 3:57:40 am
List:ru.sysoev.nginx

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;