我遇到了一个奇怪的问题,在 nginx 中启用 proxy_caching 会禁用 nginx 对相同请求的 304 响应。服务器返回 HTTP 200 响应。我的配置文件
daemon off;
pid nginx.pid;
events {}
http {
log_format serve-time '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$request_time" "$http_if_modified_since"';
server {
listen 9791 default_server;
access_log nginx-access-log.log serve-time;
error_log nginx-error-log.log;
location ~/insync {
return 200;
}
location ~ / {
expires 1d;
add_header Cache-Control public;
# add the cache status for the response as a header
add_header X-Cache-Status $upstream_cache_status;
proxy_set_header Host $remote_addr;
proxy_set_header If-Modified-Since $http_if_modified_since;
proxy_pass http://backend;
# use the cache configured above
proxy_cache MY_CACHE;
# cache only 200 Ok requests for 365 days
proxy_cache_valid 200 365d;
}
}
upstream backend {
server localhost:9792;
}
proxy_cache_path nginx-cache/ levels=1:2 keys_zone=MY_CACHE:100m max_size=90g inactive=365d;
}
启用缓存后,服务器返回 200 OK 响应。当我注释掉 proxy_cache_valid 语句(禁用缓存)时,服务器对相同请求返回 HTTP 304。我发出的请求如下
curl -i -H "If-Modified-Since: Thu, 28 May 2020 21:43:48 GMT" "http://localhost:9791/hello"
有人知道我在这里做错了什么吗?
答案1
我找到了问题所在。似乎 nginx 默认会查找 last modified 和 if-modified-since 标头之间的精确匹配。设置这个性质在配置中将值改为“之前”解决了这个问题