Ruby Forum NGINX > error_page and log_not_found in nginx 0.7.8

Posted by Steffen Weber (Guest)
on 11.08.2008 10:26
(Received via mailing list)
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.

Kind regards
Steffen Weber

[1] http://article.gmane.org/gmane.comp.web.nginx.english/4739
[2]
http://michaelshadle.com/2008/05/01/wordpress-nginx-rewrite-rules-stop-the-insanity/
Posted by Igor Sysoev (Guest)
on 11.08.2008 13:37
Attachment: patch.not_found (970 Bytes)
(Received via mailing list)
On Mon, Aug 11, 2008 at 10:20:36AM +0200, Steffen Weber wrote:

> handed off to PHP. Michael Shadle then pointed me to the log_not_found 
> "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.
Posted by Steffen Weber (Guest)
on 11.08.2008 17:14
(Received via mailing list)
Igor Sysoev wrote:
>>
>> 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.

It does, thank you very much! :)

Steffen
Posted by Steffen Weber (Guest)
on 12.08.2008 13:07
(Received via mailing list)
Igor Sysoev wrote:
>>
>> 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;

Kind regards
Steffen Weber
Posted by mike (Guest)
on 12.08.2008 18:52
(Received via mailing list)
On 8/12/08, Steffen Weber <nginx@steffenweber.net> wrote:

> 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 can see the differerence I think - cookies are sent on each request,
GET is sent via the query string.... However, I would expect that
error_page works like an internal rewrite so it should maintain the
same POST/etc. and be transparent to the end user.

Igor could this be allowed? error_page should be treated like an
internal rewrite in my opinion.
Posted by Igor Sysoev (Guest)
on 14.08.2008 15:11
Attachment: patch.static_post (1,1 KB)
(Received via mailing list)
On Tue, Aug 12, 2008 at 12:58:03PM +0200, Steffen Weber wrote:

> >>}
> >>2008/08/11 10:04:17 [error] 5887#0: *1 "/doc/root/artikel/index.php" is 
> 
> 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.