You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nginx如何排除特定查询字符串参数不进行缓存?

解决Nginx /news/路径的缓存规则问题

你之前的两种配置失效原因分别是:

  1. 直接使用fastcgi_cache_bypass $arg_view_story;时,若缓存key默认包含查询字符串,Nginx仍会尝试生成带参数的缓存条目,且变量判断逻辑不够严谨;
  2. 正则location ~ ^/news/([a-zA-Z0-9]+)$的匹配范围太窄(不匹配带结尾斜杠的URL),且如果存在更靠前的location /news/配置,会优先匹配通用规则,导致这个正则块不生效。

下面是两种可靠的解决方案:

方案一:通过变量控制缓存开关(推荐)

在你的/news/主location块内添加以下配置,精准控制缓存逻辑:

location /news/ {
    # 此处保留原有的FastCGI代理配置(如fastcgi_pass、fastcgi_param等)
    
    # 初始化缓存开关变量,默认不跳过缓存
    set $skip_cache 0;
    # 当存在view_story查询参数时,开启跳过缓存
    if ($arg_view_story) {
        set $skip_cache 1;
    }
    
    # 根据开关变量决定是否跳过缓存读取和写入
    fastcgi_cache_bypass $skip_cache;
    fastcgi_no_cache $skip_cache;
    
    # 缓存key仅包含协议、请求方法、主机和URI,确保无查询参数的URL共用缓存
    fastcgi_cache_key "$scheme$request_method$host$uri";
    
    # 以下是基础缓存配置(请替换为你的实际缓存区名称和有效期)
    fastcgi_cache NEWS_CACHE;
    fastcgi_cache_valid 200 1h;
    fastcgi_cache_valid 404 5m;
}

方案二:拆分location匹配规则

如果一定要用独立的location来区分有/无参数的URL,需要调整正则匹配优先级和范围:

# 匹配带view_story参数的/news/路径,不启用缓存
location /news/ {
    if ($arg_view_story) {
        # 这里写不缓存的FastCGI配置,直接代理到后端
        fastcgi_pass your_backend;
        # 其他必要的fastcgi_param配置
    }
}

# 匹配无查询参数的/news/xxx路径(支持是否带结尾斜杠),启用缓存
location ~ ^/news/[a-zA-Z0-9]+/?$ {
    # 此处写入你的缓存配置
    fastcgi_cache NEWS_CACHE;
    fastcgi_cache_key "$scheme$request_method$host$uri";
    fastcgi_cache_valid 200 1h;
    
    # 基础FastCGI代理配置
    fastcgi_pass your_backend;
    # 其他fastcgi_param等配置
}

注意:方案二中要确保正则location的匹配优先级高于通用的/news/配置,或者调整通用配置的逻辑避免冲突。

内容的提问来源于stack exchange,提问作者JM John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 17:17:13