我使用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;
}