WP Super Cache: "try_files" aren't allowed in "if" blocks

Maxim Dounin mdounin at mdounin.ru
Fri Sep 25 13:43:03 MSD 2009


Hello!

On Thu, Sep 24, 2009 at 11:40:15PM +0200, Igor Clark wrote:

> Hi there, hope you're all well!
> 
> I'm trying to configure nginx for the Wordpress Super Cache plugin,
> using the "Don't cache pages for logged in users" option.
> 
> I have the following config which works well once the cached file has
> been generated:
> 
>     location ~ ^/my-blog(.*)$ {
>         try_files $uri $uri/
> /my-blog/wp-content/cache/supercache/$http_host/$uri/index.html
> /my-blog/index.php;
>     }
> 
> but I don't want to serve the cached file to logged-in users, which
> according to the WPSC documentation can be found by checking the cookie
> for "(comment_author_|wordpress|wp-postpass_)".
> 
> The following snippet I found on this list doesn't work with nginx
> 0.7.61 (and nothing I see in the 0.7.62 changelog appears relevant):
> 
>     location ~ ^/my-blog(.*)$ {
>         if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_") {
>             try_files $uri $uri/ /my-blog/index.php;
>             break; # BTW, would this be necessary if it did work?
>         }
>         try_files $uri $uri/
> /my-blog/wp-content/cache/supercache/$http_host/$uri/index.html
> /my-blog/index.php;
>     }
> 
> because apparently "try_files" is not allowed inside "if":
> 
>     [emerg]: "try_files" directive is not allowed here
> 
> So I tried this:
> 
>     location ~ ^/my-blog(.*)$ {
>         if ($http_cookie !~* "comment_author_|wordpress|wp-postpass_") {
>             rewrite ^/my-blog/(.*)$
> /my-blog/wp-content/cache/supercache/$http_host/my-blog/$1/index.html
> break;
>         }
>         try_files $uri $uri/ /my-blog/index.php;
>     }
> 
> and that works fine once the cached file has been generated, but
> obviously returns 404 beforehand.
> 
> I know I could just add
> 
>     if ($http_cookie !~* "comment_author_|wordpress|wp-postpass_") {
>         if(-e [cached file]) {
>             rewrite …;
>         }
>     }
> 
> but that would seem to defeat the object of using try_files to get away
> from these if() constructions.
> 
> Is there a way to check cookie values more like a location test, or
> even, or is there a better way to do what I'm trying to do?

Try something like this:

    location /my-blog {
        if ($http_cookie ~ "comment_author_|wordpress|wp-postpass_") } {
            rewrite ^/my-blog(.*) /my-blog-loggedin$1 last;
        }

        # non logged in users

        try_files $uri $uri/
                  /my-blog/wp-content/cache/supercache/$http_host/$uri/index.html
                  /my-blog/index.php;
    }

    location /my-blog-loggedin {
        internal;
        rewrite ^/my-blog-loggedin(.*) /my-blog$1 break;
        try_files $uri $uri/ /my-blog/index.php;
    }

Maxim Dounin





More information about the nginx mailing list