И регулярные выражения, и включенные файлы - хорошие методы, и я часто использую их. Но другой альтернативой является использование «именованного местоположения», что является полезным подходом во многих ситуациях, особенно в более сложных. Официальный «Если это зло» страница показывает , по существу, следующие как хороший способ делать вещи:
error_page 418 = @common_location;
location /first/location/ {
return 418;
}
location /second/location/ {
return 418;
}
location @common_location {
# The common configuration...
}
У этих различных подходов есть свои преимущества и недостатки. Одним из больших преимуществ регулярного выражения является то, что вы можете захватывать части матча и использовать их для изменения ответа. Конечно, вы можете достичь аналогичных результатов с другими подходами, либо установив переменную в исходном блоке, либо используя map
. Недостатком подхода регулярных выражений является то, что он может стать громоздким, если вы хотите сопоставлять различные местоположения, плюс низкий приоритет регулярного выражения может просто не соответствовать тому, как вы хотите сопоставлять местоположения - не говоря уже о том, что, очевидно, это влияет на производительность от регулярных выражений в некоторых случаях.
Основное преимущество включения файлов (насколько я могу судить) состоит в том, что он немного более гибок в отношении того, что именно вы можете включить - например, он не должен быть полным блоком местоположения. Но это также субъективно немного грубее, чем названные места.
Также обратите внимание, что есть связанное решение, которое вы можете использовать в подобных ситуациях: вложенные местоположения. Идея состоит в том, что вы должны начать с очень общего местоположения, применить некоторую конфигурацию, общую для нескольких возможных совпадений, а затем иметь отдельные вложенные местоположения для различных типов путей, которые вы хотите сопоставить. Например, может быть полезно сделать что-то вроде этого:
location /specialpages/ {
# some config
location /specialpages/static/ {
try_files $uri $uri/ =404;
}
location /specialpages/dynamic/ {
proxy_pass http://127.0.0.1;
}
}