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