基于 referrer 的不同 nginx 规则

基于 referrer 的不同 nginx 规则

我正在使用 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;
    }
}

我应该怎么做才能达到我的目标?

答案1

我对 WP Supercache 不太熟悉,但如果您只需要重写 index.php 以避免缓存,那应该不会太难。

您现有的过滤器并不全面,因为它仅检查 google.com 和 google.co。根据此列表,Google 使用的许多 TLD 均不匹配,例如 google.de、google.fr 等。

以下过滤器应将您限制为以 www.google 开头并以 2-3 个字符的 TLD 的任意组合结尾的引荐来源。

if ($http_referer ~* ^www.google.[a-z]{2,3}(.[a-z]{2})?$ ) {
    # do whatever you need to do here to avoid caching
}

答案2

你快到了。

首先,WP Super Cache的规则很乱。它们确实需要重新设计从头开始,但那是另一天的项目。

为了使其正常工作,请不要立即返回,而是$supercache_uri = ''像所有其他检查一样进行设置。例如:

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

$supercache_uri这需要出现在原来的位置之后set,而不是在它的开头。

答案3

这可能适用于$http_referer:

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

答案4

尝试这个

if ($http_referer ~* (www.example.com|example.com.au) ) {
           return 301 http://your-url.example/custom-path;
}

相关内容