Сначала nginx проверяет location с префиксом, потом находит location c regex так как он более специфичен. Соответственно все директивы будут применяться из `location ~ (\.xml|\.json)$ {`.
Выход в том, чтобы сделать /user/ более специфичным и указать его в начале (порядок важен):
proxy_cache_path /mnt/cache_nginx/json levels=1:2 keys_zone=cache_api:100m inactive=72h max_size=1G;
server {
listen 443 ssl;
# зона запросов, где кеш отключен
location ~ /user/.*(\.xml|\.json)$ {
proxy_cache off;
proxy_intercept_errors off;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
}
location ~ (\.xml|\.json)$ {
proxy_cache cache_api;
proxy_cache_valid 502 503 1m;
proxy_cache_valid 404 1h;
proxy_cache_valid any 3d;
proxy_cache_key $request_uri;
proxy_intercept_errors off;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
}
}