Различные правила nginx, основанные на реферере

12

Я использую WordPress с WP Super Cache. Я хочу, чтобы посетители, пришедшие из Google (которые включают в себя все источники, относящиеся к конкретной стране, такие как google.co.in, google.co.uk и т. Д.), Могли видеть содержимое в кэше .

Вот мои правила nginx, которые работают не так, как я хочу:

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;
    }
}

Что я должен сделать, чтобы достичь своей цели?

Дилан Валаде
источник

Ответы:

3

Я не знаком с WP Supercache, но если вам просто нужно переписать в index.php, чтобы избежать кеша, это не должно быть слишком сложно.

Ваш существующий фильтр не является исчерпывающим, поскольку он проверяет только google.com и google.co. Согласно этому списку , существует множество TLD, которые Google не использует, например, google.de, google.fr и т. Д.

Следующий фильтр должен ограничивать вас реферерами, которые начинаются с www.google и заканчиваются любой комбинацией из 2-х символьного TLD.

if ($http_referer ~* ^www.google.[a-z]{2,3}(.[a-z]{2})?$ ) {
    # do whatever you need to do here to avoid caching
}
Farray
источник
2

Ты почти там.

Во-первых, правила WP Super Cache очень грязные. Они действительно должны быть переработаны с нуля, но это проект для другого дня.

Чтобы это работало, не возвращайте сразу, вместо этого установите $supercache_uri = ''как все остальные проверки. Например:

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

Это должно появиться ПОСЛЕ точки, в которой $supercache_uriнаходится изначально set, а не в начале, где она у вас есть.

Майкл Хэмптон
источник
0

это может работать для $ http_referer:

       if ($http_referer ~* (www.google.com|www.google.co) ) {
               break;
       }
       if (!-e $request_filename) {
               rewrite . /index.php break;
       }

источник
это также не работает
-1

Попробуй это

if ($http_referer ~* (www.example.com|example.com.au) ) {
           return 301 http://your-url.example/custom-path;
}
Ansyori
источник
2
Я не понимаю
Pierre.Vriens
1
Я тоже не понимаю. Как перенаправление браузера на другой URL-адрес позволяет избежать кэширования на стороне сервера?
Майкл Хэмптон