Nginx的proxy_cache_key和HEAD-> GET请求

我有以下的Nginxconfiguration:

http { ... proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=3000m inactive=600m; proxy_temp_path /var/tmp; ... upstream webhook_staging { server 127.0.0.1:4001; keepalive 64; } location /webhooks/incoming_mails { client_max_body_size 60m; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header Connection ""; proxy_http_version 1.1; # Does not work for HEAD requests #>> proxy_cache one; #>> proxy_cache_key $scheme$host$request_uri; proxy_pass http://webhook_staging; } } 

上游服务器是一个常规的Node.js进程。 如果我激活上面的proxy_cache_*指令,则HEAD请求会向上游服务器传递一个GET请求。 如果我停用指令HEAD请求作为HEAD请求传递,一切都很好。

有什么build议么?

谢谢!

要在HEAD请求上禁用caching,你必须使用一些额外的逻辑,例如:

 server { ... resolver 127.0.0.1; location / { error_page 420 = @skip_cache; error_page 421 = @use_cache; if ( $request_method = 'GET' ) { return 421; } return 420; } location @use_cache { internal; proxy_cache cache; proxy_cache_key "..."; proxy_cache_valid 200 1h; proxy_buffering off; proxy_pass ...; } location @skip_cache { internal; proxy_buffering off; proxy_pass ...; } } 

我还没有find一种方法来防止Nginx的caching启用时,将HEAD更改为GET :-(。

这个问题很古老,但仍然是相关的,没有答案。 我花了几个小时find了解决scheme,从1.9.7版本的Nginx,包括一个新的function,正是你想要的。

添加到你的configuration:

 proxy_cache_convert_head off; proxy_cache_methods GET HEAD; proxy_cache_key $scheme$request_method$proxy_host$request_uri; 

第一行禁用http请求的转换,第二行除了GET之外,还允许cachingHEAD请求。 第三行添加$ request_method到proxy_cache_key,所以头请求将被caching为一个单独的文件。