Você pode conseguir isso usando um local aninhado como este:
location /gameserver/ { root /var/www/public; index index.html; location ~ \.pk3$ { } return 403; }
O bloco de localização vazio é intencional e obrigatório porque o nginx não suporta correspondências de expressão regular negativas. Se um arquivo estiver localizado abaixo de / gameserver / e terminar em .pk3, o bloco de localização vazio será igualado e a solicitação será concedida. Você pode adicionar diretivas adicionais lá, é claro. Se um arquivo está localizado abaixo de / gameserver / e não termina em .pk3, o bloco de localização interna não coincide e, em vez disso, o retorno 403 (acesso proibido) é executado.
A regra geral com nginx é que você deseja evitar "if" e, se precisar de qualquer forma de correspondência de caminho, deseja confiar nos blocos de localização (aninhados).