gpt4 book ai didi

Nginx:根据 HTTP 方法启用/禁用缓存

转载 作者:行者123 更新时间:2023-12-04 14:56:48 25 4
gpt4 key购买 nike

我在serverfault上问了这个问题,但没有人回答。希望,stackoverflow 的人更了解 Nginx :)

我想处理从缓存到/api 的所有 [GET] 请求,并像在最后一个位置 block 中一样处理所有其他请求(没有缓存)。所有使用 PUT、POST、DELETE 方法对/api 的请求也不必使用缓存。

我看到了类似的问题here ,但在我的情况下仍然无法理解如何使用它。

提前致谢。

我的配置:

location / {
root /var/www/project/web;
# try to serve file directly, fallback to app.php
try_files $uri /app.php$is_args$args;
}


location ~ ^/api {
root /var/www/project/web/app.php;
fastcgi_send_timeout 600s;
fastcgi_read_timeout 600s;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/?.*)$;
include fastcgi_params;
fastcgi_cache fcgi;
fastcgi_cache_valid 200 5m;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;

}

location ~ ^/(app|app_dev|config)\.php(/|$) {
root /var/www/project/web;
fastcgi_send_timeout 600s;
fastcgi_read_timeout 600s;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/?.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}

最佳答案

谢天谢地,这很简单。 Nginx 的模块(proxy、fastcgi、uwsgi 等)都有能力通知请求不要使用缓存。

location ~ ^/api {
root /var/www/project/web/app.php;
fastcgi_send_timeout 600s;
fastcgi_read_timeout 600s;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/?.*)$;
include fastcgi_params;

# Don't cache anything by default
set $no_cache 1;

# Cache GET requests
if ($request_method = GET)
{
set $no_cache 0;
}

fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;

fastcgi_cache fcgi;
fastcgi_cache_valid 200 5m;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}

根据 Richard Smith 的建议,使用 maps 指令的更优雅的解决方案如下:
map $request_method $api_cache_bypass {
default 1;
GET 0;
}

location ~ ^/api {
root /var/www/project/web/app.php;
fastcgi_send_timeout 600s;
fastcgi_read_timeout 600s;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/?.*)$;
include fastcgi_params;

fastcgi_cache_bypass $api_cache_bypass;
fastcgi_no_cache $api_cache_bypass;

fastcgi_cache fcgi;
fastcgi_cache_valid 200 5m;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
}

对位置的添加本质上是告诉 Nginx 根据动词使用或忽略缓存。它将 $no_cache 设置为 1,这将绕过所有请求的缓存,除非方法是 GET,当它设置为 0 时指示它使用缓存(如果可用)。

关于Nginx:根据 HTTP 方法启用/禁用缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35290764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com