如何配置 nginx 以根据 cookie 从文件提供服务

如何配置 nginx 以根据 cookie 从文件提供服务

我正在开发一个电子商务平台,该平台为登录用户提供动态内容,但对于已注销的用户,许多页面(例如产品页面和类别页面)都是相对静态的。

Rails 已配置为在访问时将特定的已注销页面的副本保存到磁盘。

我希望 nginx 在检测到已注销用户时提供这些文件。我们在用户登录时设置了一个 cookie,所以我希望可以检查这一点。

我的“理想” nginx 配置看起来像(在服务器块中):

location /my_location { 
    if (!$cookie_user_logged_in) { 
        try_files /cached_pages/$uri /cached_pages/$uri.html $uri $uri/index.html $uri.html @rails_application; 
    } 
}

然而,这是无效的,因为据我所知,基于研究和错误消息,不能将 try_files 放在 if 中。

有没有办法用 nginx 来实现这个?

有人告诉我应该使用 Varnish 等其他工具来实现这一点。我还知道我可以使用 Rails 中的动作缓存和片段缓存来实现相同的目的。但是,在添加技术堆栈或进一步投资开发之前,我想确定这是否是一个可行的选择。

答案1

我没有尝试在 if 中使用 try_files,但下面的代码对我有用。基本上,如果 cookie 测试成功,它会在特定位置 {} 内复制 php-fpm 连接。它允许对 admin-ajax.php 进行未经身份验证的访问,并拒绝对 /wp-admin/ 中其他所有内容进行未经身份验证的访问

在配置文件的下方有一个location ~\.php {...}通常处理 php 请求的块。

        location ~ /wp-admin/ {
            set $adminok 0;
            if ($http_cookie ~* "admincookie" ) {
                    set $adminok  1;
            }
            if ($request_filename ~* "admin-ajax.php" ) {
                    set $adminok  1;
            }
            if ($adminok != 1) {
                    return 403;
            }
            include fastcgi_params;
            if (-f $document_root$fastcgi_script_name) {
                    set $doc $document_root$fastcgi_script_name;
            }
            if (!-f $document_root$fastcgi_script_name) {
                    set $doc $document_root/wp-admin/index.php ;
            }
            fastcgi_param  SCRIPT_FILENAME  $doc ;
            fastcgi_pass unix:$server_unix_socket ;
            fastcgi_cache_bypass 1;
        }

相关内容