Назад | Перейти на главную страницу

Nginx Cache, даже если это ответ 404

Я использую URL-адрес перезаписи 404:

    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?

Я все еще не уверен, почему, но мне нужно было изменить ключ кеша.

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;
    }

Кэширование ответов об ошибках возможно с помощью 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), поле заголовка будет добавлено независимо от кода ответа.