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