O seguinte deve funcionar para exibir o cabeçalho de expiração que foi definido no mesmo bloco de localização ...
try_files $uri $uri/ /$1/$2 =404;
De acordo com o wiki do Nginx, try_files deve terminar com um URI ou com um código de status. Você pode obter mais informações sobre o motivo pelo qual as expirações não estão definidas, se você habilitar a depuração de no Nginx .
Atualizar :
Ideas why the expires headers arn't being passed?
Eu habilitei a depuração para descobrir essa situação interessante. Isso é o que eu encontrei ...
Aqui está uma citação direta do artigo wiki try_files vinculado anteriormente ...
If none of the files were found, an internal redirect to the uri specified in the last parameter is made.
Então, quando você usou o seguinte código ...
try_files $uri $uri/ /$1/$2;
o nginx não encontrou $uri
e $uri/
(no seu caso /css/v1/afile.css e /css/v1/afile.css/), um redirecionamento interno para o URI especificado no último parâmetro é feito. Então, após o redirecionamento interno, a localização /$1/$2
é encontrada (no seu caso /css/afile.css), em outro bloco de localização . Desde então, ele é executado por outro bloco de localização que não tem nenhuma expiração, você não viu expirar.