Location header, memcached, nginx, django and redirected paths

Michel Sabchuk michelts at gmail.com
Fri Aug 20 22:04:52 MSD 2010


Hi guys, how are you?

I using nginx, django and memcached for a site. If some path isn't on
memcached, nginx send it to apache/django, the cache are generated
and, until it expires, nginx takes care of the requests by sending it
to memcached directly.

It works very well except when django tries to redirect a user using a
301 or 302 redirect (for login protected pages in example).

I reading the debug but, as far as I could undestand, the problem is
related with the "memcached_pass" instruction. I removed the
memcached_pass instruction sending all the traffic to the fallback and
the redirects worked again.

Is there any way to test the request and check if it is a redirect
and, in this case, just do a proxy_pass? I see that all redirects have
a "Location: something" header. I could not test it, does anyone know
how to?

Here is my configuration file:

upstream backend {
    server 127.0.0.1:8000 weight=1;
}

server {
    listen 80 default;
    server_name localhost;

    location / {

        # do not cache post requests
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        if ($request_method = POST) {
            proxy_pass http://backend;
            break;
        }

        # how to check if this is a redirection?
        if ($http_location ~* .+) {
            proxy_pass http://backend;
            break;
        }

        # each page can have a pv cookie that sets the page version of this
        # page. It can be used for login pages
        if ($http_cookie ~* "pv=([^;]+)(?:;|$)") {
            set $page_version $1;
        }
        set $memcached_key PR:$request_uri&pv=$page_version;
        default_type text/html;
        memcached_pass 127.0.0.1:11211;

        # if the page was not found in memcached, go to the backend
        error_page 501 502 404 405 @fallback;
    }

    location @fallback {
        proxy_pass http://backend;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

}

Can I paste some nginx error log snippet (debugged)?

Thanks for any help.

-- 
Michel Thadeu Sabchuk
Curitiba - Brasil



More information about the nginx mailing list