我正在尝试使用 Nginx 页面缓存而不是 Wordpress 缓存。缓存似乎工作正常,但我无法根据变量设置条件缓存标头 - 用户是否登录到 wordpress。如果用户已登录,我希望应用无缓存标头,否则 Wordpress 和 CDN 都可以将页面缓存一天。我发现我只能在 if 语句中添加一个标题。
我已经阅读(但没有完全理解,因为这里已经很晚了)[如果是邪恶的][1]。我还找到了关于堆栈交换的答案(在我的笔记本电脑上,现在找不到),在 if 块中只有一个 add_header 有效。
谁能给我一个可能更好的替代方案的想法?我知道我可以将过期与缓存控制结合起来,但我想要更多的标题,而且我想理解和学习。
这是一个显着简化的配置,其中包含相关部分。
server {
server_name example.com;
set $skip_cache 0;
# POST requests and urls with a query string should always go to PHP
if ($request_method = POST) {
set $skip_cache 1;
}
if ($query_string != "") {
set $skip_cache 1;
}
# Don't cache uris containing the following segments.
if ($request_uri ~* "/wp-admin/|/admin-*|/xmlrpc.php|wp-.*.php|/feed/|index.php|sitemap(_index)?.xml") {
set $skip_cache 1;
}
# Don't use the cache for logged in users or recent commenters
if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {
set $skip_cache 1;
}
location / {
try_files $uri $uri/ /blog/index.php?args;
}
location ~ \.(hh|php)$ {
fastcgi_keep_conn on;
fastcgi_intercept_errors on;
fastcgi_pass php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# Cache Stuff
fastcgi_cache CACHE_NAME;
fastcgi_cache_valid 200 1440m;
add_header X-Cache $upstream_cache_status;
fastcgi_cache_methods GET HEAD;
fastcgi_cache_bypass $skip_cache;
fastcgi_no_cache $skip_cache;
add_header Z_ABCD "Test header";
if ($skip_cache = 1) {
add_header Cache-Control "private, no-cache, no-store";
add_header CACHE_STATUS "CACHE NOT USED";
}
if ($skip_cache = 0) {
add_header Cache-Control "public, s-maxage = 240";
expires 1d;
add_header CACHE_STATUS "USED CACHE";
}
add_header ANOTHER_HEADER "message";
}
}
指令的替代方案
if
是map
指令。假设CACHE_STATUS
vsCACHE_STATIC
只是您问题中的一个错字,您可以试试这个:map
指令应放置在容器内http
(与块处于同一级别server
),如上所示。该
map
指令在此处记录。根据@Richard Smith 提供的答案,我自己提出了一种解决方案,但它并没有完全满足我的需求。我使用了更多的缓存控制标头,并删除了不必要的 expires 指令。
这位于服务器块内
然后进入每个适用的位置块
这意味着在 location 块内不需要“if”。我认为这可以解决问题,但是如果有人有其他想法,我仍然很感兴趣。