how to redirect user from handler

Maxim Dounin mdounin at mdounin.ru
Thu Sep 20 13:17:29 UTC 2012


Hello!

On Thu, Sep 20, 2012 at 12:31:12PM +0300, Anatoli Marinov wrote:

[...]

> And this seems to work but 302 answer has a body and it is a chunked
> response?

This is because you said it to.

> Is it possible to send it without body.

No, it's not allowed by a protocol (unless request was HEAD).  
Response body must be present.  It may be empty though.

> I also do not want to be chunked if it is possible.

It is.  You should set content length, then chunked encoding won't 
be used.  You may take a look at ngx_http_send_response() for a 
complete code (and the function is actually a usefull helper for 
simple cases when you need to return some predefined response).

But actually to return a 302 redirect from a content handler it's 
enough to set Location header and return NGX_HTTP_MOVED_TEMPORARILY, 
i.e. to do something like this:

    ngx_http_clear_location(r);

    r->headers_out.location = ngx_palloc(r->pool, sizeof(ngx_table_elt_t));
    if (r->headers_out.location == NULL) {
        return NGX_HTTP_INTERNAL_SERVER_ERROR;
    }

    /*
     * we do not need to set the r->headers_out.location->hash and
     * r->headers_out.location->key fields
     */

    ngx_str_set(&r->headers_out.location->value, "http://example.com/");

    return NGX_HTTP_MOVED_TEMPORARILY;

(The code was mostly borrowed from static module, with minor 
modification.)

Maxim Dounin


> 
> 
> 
> On 09/20/2012 12:12 PM, Anatoli Marinov wrote:
> >Hello Colleagues,
> >Which is the right way to redirect user request from handler
> >module. Now I have something like this in my handler:
> >
> >My handler function(r) {
> >    header = ngx_list_push(&r->headers_out.headers);
> >    header->key.len = sizeof("Location") - 1;
> >    header->key.data = (u_char *) "Location";
> >
> >    header->value.len = strlen("http://new_location.com/1.dat");
> >    header->value.data = ngx_pcalloc(r->pool, header->value.len);
> >
> >    ngx_snprintf(header->value.data, header->value.len, "%s",
> >"http://new_location.com/1.dat");
> >    r->headers_out.status = NGX_HTTP_MOVED_TEMPORARILY;
> >    r->chunked = 0;
> >
> >    ngx_http_send_header(r);
> >
> >    return NGX_DECLINED;
> >}
> >
> >I think this approach is wrong. It sends 302 to the client but
> >there is a body with 404 return code which is not correct.
> >
> >
> >So please advise me how to redirect from hander.
> >
> >Thanks in advance
> >Anatoli Marinov
> >
> >_______________________________________________
> >nginx-devel mailing list
> >nginx-devel at nginx.org
> >http://mailman.nginx.org/mailman/listinfo/nginx-devel
> 
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel



More information about the nginx-devel mailing list