在 nginx 中启用代理缓存会禁用 304 响应

在 nginx 中启用代理缓存会禁用 304 响应

我遇到了一个奇怪的问题,在 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 标头之间的精确匹配。设置这个性质在配置中将值改为“之前”解决了这个问题

相关内容