nginx 中 proxy_cache_key 的默认值是 $scheme$proxy_host$request_uri。这意味着缓存键由协议方案、代理主机地址和请求 uri 三部分拼接而成,不包含查询参数以外的其他信息。

proxy_cache_key 默认值包含哪些变量
默认配置下,Nginx 使用三个核心变量构建缓存键:$scheme 表示当前请求的协议(如 http 或 https),$proxy_host 表示后端服务器的地址和端口,$request_uri 表示完整的请求 URI,包含路径和查询字符串。这三个变量共同决定了缓存的唯一性。

scheme: $scheme
host: $proxy_host
uri: $request_uri
key: ${scheme}${proxy_host}${request_uri}
当 Nginx 接收到一个请求时,它会提取这三个变量的值并拼接成一个字符串作为缓存键。例如,对于 http://example.com/api/data?id=1,缓存键将是 httpexample.com/api/data?id=1。如果请求的 URI 发生变化,即使只是查询参数不同,也会生成不同的缓存键,从而被视为不同的资源。
如何自定义 proxy_cache_key 以优化缓存策略
可以通过修改 proxy_cache_key 指令来自定义缓存键,以适应特定的业务需求。常见的做法是添加 $cookie_sessionid 或 $http_authorization 等变量,以确保不同用户或会话的缓存隔离。

# 示例:基于会话 ID 的缓存键 proxy_cache_key "$scheme$proxy_host$request_uri$cookie_sessionid";
在上面的示例中,缓存键不仅包含默认的协议、主机和 URI,还加入了用户的会话 ID。这样可以确保不同用户的请求不会共享同一个缓存条目,从而提高缓存的准确性和安全性。需要注意的是,自定义缓存键可能会增加内存消耗,因为每个唯一的缓存键都需要占用一定的存储空间。
当 $request_uri 包含特殊字符时如何处理
当 $request_uri 包含特殊字符(如空格、中文或 URL 编码字符)时,Nginx 会直接将其拼接到缓存键中,不进行额外的转义或处理。这可能导致缓存键变得复杂且难以调试。
为了解决这个问题,可以在自定义 proxy_cache_key 时使用 $uri 代替 $request_uri。$uri 只包含请求的路径部分,不包含查询字符串,因此可以避免特殊字符带来的问题。如果需要保留查询字符串,可以使用 $args 变量,它只包含查询参数部分,且经过 URL 解码。
# 示例:使用 $uri 和 $args 构建缓存键 proxy_cache_key "$scheme$proxy_host$uri$args";
这种写法将路径和查询参数分开处理,使得缓存键更加清晰和可控。同时,$args 变量会自动对特殊字符进行 URL 编码,确保缓存键的合法性。在实际应用中,可以根据具体需求选择合适的变量组合,以平衡缓存效率和安全性。


















