O regex e os arquivos incluídos são bons métodos, e eu os uso com frequência. Mas outra alternativa é usar um "local nomeado", que é uma abordagem útil em muitas situações - especialmente as mais complicadas. A página oficial "If is Evil" mostra essencialmente o seguinte como uma boa maneira de fazer as coisas:
error_page 418 = @common_location;
location /first/location/ {
return 418;
}
location /second/location/ {
return 418;
}
location @common_location {
# The common configuration...
}
Existem vantagens e desvantagens nessas várias abordagens. Uma grande vantagem de uma regex é que você pode capturar partes da correspondência e usá-las para modificar a resposta. Obviamente, você geralmente pode obter resultados semelhantes com as outras abordagens, definindo uma variável no bloco original ou usando map
. A desvantagem da abordagem regex é que ela pode ficar pesada se você deseja combinar uma variedade de locais, além da baixa precedência de uma regex simplesmente não se encaixar na maneira como você deseja combinar locais - sem mencionar que aparentemente há impactos no desempenho de regexes em alguns casos.
A principal vantagem de incluir arquivos (até onde eu sei) é que ele é um pouco mais flexível sobre exatamente o que você pode incluir - não precisa ser um bloco de localização completo, por exemplo. Mas também é subjetivamente um pouco mais desajeitado do que locais nomeados.
Observe também que há uma solução relacionada que você pode usar em situações semelhantes: locais aninhados. A idéia é que você comece com um local muito geral, aplique alguma configuração comum a várias das correspondências possíveis e, em seguida, tenha locais aninhados separados para os diferentes tipos de caminhos que deseja corresponder. Por exemplo, pode ser útil fazer algo assim:
location /specialpages/ {
# some config
location /specialpages/static/ {
try_files $uri $uri/ =404;
}
location /specialpages/dynamic/ {
proxy_pass http://127.0.0.1;
}
}