Different nginx rules based on referrer

juana asked:

I’m using WordPress with WP Super Cache. I want visitors who come from Google (That inlcudes all country specific referrers like google.co.in, google.co.uk and etc.) to see uncached contents.

There are my nginx rules which are not working the way I want:

server {
    server_name  website.com;
    location / {
        root   /var/www/html/website.com;
        index  index.php;
           if ($http_referer ~* (www.google.com|www.google.co) ) {
                   rewrite . /index.php break;
           }
           if (-f $request_filename) {
                   break;
           }
           set $supercache_file '';
           set $supercache_uri $request_uri;
           if ($request_method = POST) {
                   set $supercache_uri '';
           }
           if ($query_string) {
                   set $supercache_uri '';
           }
           if ($http_cookie ~* "comment_author_|wordpress|wp-postpass_" ) {
                   set $supercache_uri '';
           }
           if ($supercache_uri ~ ^(.+)$) {
                   set $supercache_file /wp-content/cache/supercache/$http_host/$1index.html;
           }
           if (-f $document_root$supercache_file) {
                   rewrite ^(.*)$ $supercache_file break;
           }
           if (!-e $request_filename) {
                   rewrite . /index.php last;
           }
    }
    location ~ .php$ {
            fastcgi_pass    127.0.0.1:9000;
            fastcgi_index   index.php;
            fastcgi_param   SCRIPT_FILENAME /var/www/html/website.com$fastcgi_script_name;
            include         fastcgi_params;
    }
}

What should I do to achieve my goal?

My answer:


You’re almost there.

First, the WP Super Cache rules are very messy. They really need to be redesigned from the ground up, but that’s a project for another day.

To get this working, don’t return immediately, instead set the $supercache_uri = '' as all of the other checks do. For instance:

if ($http_referer ~* (www.google.com|www.google.co) ) {
    set $supercache_uri '';
}

This needs to appear AFTER the point where $supercache_uri is originally set, and not at the beginning where you have it.


View the full question and answer on Server Fault.

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.