Nginx 缓存,即使是 404 响应

Nginx 缓存,即使是 404 响应

我使用404重写url:

    error_page 404 = /url_rewriting.php;

我将使用渲染脚本生成的图像缓存在文件夹 /render/ 中:

    set $no_cache 0;

    location ~ /render/ {
            include snippets/fastcgi-php.conf;
            #fastcgi_pass unix:/run/php/php7.0-fpm.sock;
            fastcgi_pass 127.0.0.1:9000;

            fastcgi_buffers 8 16k; # increase the buffer size for PHP-FTP
            fastcgi_buffer_size 32k; # increase the buffer size for PHP-FTP
            fastcgi_cache_key $scheme$host$request_uri$request_method;
            fastcgi_cache PROD;
            fastcgi_cache_valid any 20d;
            fastcgi_cache_valid 404      1d;
            fastcgi_cache_use_stale updating error timeout invalid_header http_500 http_503;
            fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
            fastcgi_hide_header "Set-Cookie";
            fastcgi_cache_bypass $no_cache;
            fastcgi_no_cache $no_cache;
            expires 10M;
            access_log off;
            add_header Cache-Control "public";
            add_header X-Cache-Status $upstream_cache_status;
    }

缓存与这样的 URL 一起工作:

https://mywebsite.com/include/php/render/framed/img.php?VR=1&size=300&image=U3pmwKi

但是缓存不适用于如下 URL:

https://mywebsite.io/include/php/render/framed/file/VR/1/size/300/image/U3dpwK

第二个 URL 成功通过,error_page 404 = /url_rewriting.php;因为目录“file”不存在,但脚本通过 url_rewriting.php 脚本显示了图像。

我必须更新我的 Nginx 配置才能缓存 404 响应?

答案1

使用关键字可以缓存错误响应always

add_header Cache-Control "public; max-age=3600" always;

来自文档

如果响应代码等于 200、201(1.3.10)、204、206、301、302、303、304、307(1.1.16、1.0.13)或 308(1.13.0),则将指定字段添加到响应头...如果always指定了该参数(1.7.5),则无论响应代码如何,都会添加标头字段。

答案2

我仍然不确定为什么,但我需要更改缓存键。

proxy_cache_key "$host$request_uri";

完整区块:

    location / {
        proxy_pass http://gitlab-pages;
        include proxy_params;

        more_set_input_headers  "Host: templates.pages.example.com";

        proxy_cache            gitlab;
        proxy_cache_key        "$host$request_uri";
        proxy_cache_use_stale  error timeout updating http_500 http_502 http_503 http_504 http_404;
        proxy_cache_lock       on;
        proxy_cache_valid      200 302 304 404 5m;
        proxy_cache_valid      any 1m;
        proxy_cache_revalidate on;
        proxy_ignore_headers   "Set-Cookie";
        proxy_hide_header      "Set-Cookie";

        add_header            X-CACHE $upstream_cache_status always;
    }

相关内容