У меня следующая конфигурация Nginx:
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_*
директивы выше, a HEAD
запрос передан GET
запрос к вышестоящему серверу. Если я отключу директивы, HEAD
запрос передается как HEAD
запрос и все нормально.
Какие-либо предложения?
Спасибо!
Это очень старый вопрос, но он все еще актуален и остается без ответа. Я потратил несколько часов на то, чтобы найти решение этой проблемы, Nginx от v .1.9.7, включает новую функцию, которая делает именно то, что вы хотите.
Добавьте это в свою конфигурацию:
proxy_cache_convert_head off;
proxy_cache_methods GET HEAD;
proxy_cache_key $scheme$request_method$proxy_host$request_uri;
Первая строка отключает преобразование HTTP-запроса, а вторая строка включает кеширование HEAD-запросов в дополнение к GET. Третья строка добавляет $ request_method к proxy_cache_key, поэтому запросы заголовка будут кэшироваться как отдельный файл.
Чтобы отключить кеширование запросов HEAD, вам нужно использовать дополнительную логику, например:
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 ...;
}
}
Я не нашел способа запретить nginx изменить HEAD на GET, когда кеш включен :-(.