如何有条件地删除 Nginx 中的 try_files 指令子集?

如何有条件地删除 Nginx 中的 try_files 指令子集?

我正在尝试有条件地删除try_files自定义标头时绕过静态 HTML 缓存的指令X-无缓存存在。

从理论上讲,这就是我想做的事情:

location @wp {
  try_files $uri $uri/ /index.php?$query_string;
}

location / {
  if ($http_x_no_cache) {
    @wp;
  }
  try_files /cache$request_uri.html /cache$request_uri/index.html $uri $uri/ /index.php?$query_string;
}

这样做的原因是,登录网站的用户可以发送请求X-无缓存标头并绕过静态缓存。

答案1

如果您想阻止未登录用户的缓存,您应该检查 WordPress 登录 cookie 的值。这样您就不需要设置这些标头。

此配置可以产生您所寻找的结果:

http {
    map $http_cookie $cachefiles {
        default "/cache/$request_uri.html /cache$request_uri/index.html";
        "~.*wordpress_logged_in.*" "";
    }
    server {
        try_files $cachefiles $uri $uri/ /index.php?$query_string;
    }
}

答案2

我能够按预期完成这项工作。您不能在map指令中使用空格。因此,为了解决这个问题,我不得不删除额外的 try 文件位置。我不得不更新我的后端,这样我就不再需要查看多个位置了。

map $http_cookie $cachefiles {
    default "/cache/$new_request_uri.html";
    "~*wordpress_logged_in" "";
}

server {
    ....
    
    set $new_request_uri $request_uri;
    
    # parse URL and remove ending and trailing slashes
    if ($request_uri ~ ^\/(.*)\/$) {
        set $new_request_uri $1;
    }
    
    # if root then use index
    if ($request_uri ~ ^\/$) {
        set $new_request_uri index;
    }

    .....
    
    location / {
        try_files $cachefiles $uri $uri/ /index.php?$query_string;
    }

    ....
}

相关内容