跳过网站某些区域的 nginx PHP 缓存?

跳过网站某些区域的 nginx PHP 缓存?

我刚刚用 nginx(我刚开始使用)和 PHP 设置了一个新服务器。我的网站上基本上有 3 种不同类型的文件:

  • 静态内容,如 CSS、JS 和一些图像(大多数图像位于外部 CDN 上)
  • 主要的 PHP/MySQL 数据库驱动的网站,本质上就像一个静态网站
  • 动态 PHP/MySQL 论坛

据我了解这个问题这一页静态文件不需要特殊处理并且会尽快提供。

我按照上面问题的答案设置了 PHP 文件的缓存,现在我有一个如下配置:

location ~ \.php$ {
    try_files $uri =404;

    fastcgi_cache one;
    fastcgi_cache_key $scheme$host$request_uri;
    fastcgi_cache_valid  200 302 304 30m;
    fastcgi_cache_valid  301 1h;

    include /etc/nginx/fastcgi_params;
    fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /srv/www/example$fastcgi_script_name;
    fastcgi_param HTTPS off;
}

但是,现在我想阻止论坛上的缓存(针对所有人或仅针对登录用户 - 尚未检查后者是否适用于论坛软件)。我听说位置块内的“if is evil”,所以我不确定如何继续。对于位置块内的 if,我可能会在中间添加以下内容:

if ($request_uri ~* "^/forum/") {
    fastcgi_cache_bypass 1;
}
# or possible this, if I'm able to cache pages for anonymous visitors
if ($request_uri ~* "^/forum/" && $http_cookie ~* "loggedincookie") {
    fastcgi_cache_bypass 1;
}

这样可以吗,或者有更好的方法来实现这一点?

答案1

您可以在服务器块中使用 if,这是非常安全的。包含相关行的工作示例:

server {
    listen   80;
...skip...
    if ($uri ~* "/forum" ) {set $no_cache 1;}
...skip...

    location ~ \.php$ {

        fastcgi_cache_bypass $no_cache;
        fastcgi_no_cache $no_cache;

      ...other fastcgi-php content...
}

答案2

解决此问题的另一种方法是在默认位置块上方设置一个单独的位置块,以捕获发往论坛的内容并采取不同的措施:

location ~ ^/forum/.*\.php$ {
    // forum php setup here
}
location ~ \.php$ {
    // regular php setup here
}

它并非完全 DRY,但当你 6 个月后再回头阅读它时,它就变得简单易读。

相关内容