Ваша конфигурация была бы намного чище, если бы вы прибегли к простым rewrite
s непосредственно в контексте server
:
server {
server_name www.my-domain.com my-domain.com;
root /var/www/my-project/;
rewrite ^/(es|en|ca)$ /index_$1.html;
location = / {
index index_es.html;
}
# ...
}
Для веб-сайта stati c я бы рекомендовал полностью исключить try_files
. Это имеет смысл только для динамических c веб-сайтов, а может быть злым .
Почему мне сейчас нужно поместить location = / кусок кода чтобы заставить его работать?
Потому что в вашей опубликованной конфигурации, если вы удалите его, тогда для URI /
, NGINX выберет блок location / {
, который будет пытаться (из-за $uri/
) файлы, определенные как index
, по умолчанию - index.html
. Таким образом, он попытается проверить, существует ли он, преуспеть в этом и использовать его для обслуживания запроса.
После того, как вы определите location = /
, NGINX будет использовать его для обслуживания, потому что тип точного соответствия (=
) всегда имеет приоритет в NGINX по сравнению с другими типами местоположения.
Как я могу оптимизировать конфигурацию, чтобы удалить location = / piece of code?
Вам действительно не нужно удалять location = /
(см. Измененную конфигурацию выше). Во всяком случае, предпочтительнее точный тип соответствия, так как это приведет к наиболее быстрому сопоставлению. (если вы не можете справиться с этим, удалив проверки существования файлов, см. ниже).
Кто-то может возразить, будет ли:
location = /es {
try_files /index_es.html /index.html;
}
location = /en {
try_files /index_en.html /index.html;
}
location = /ca {
try_files /index_ca.html /index.html;
}
... быстрее, чем предложенный rewrite
. Это не будет быстро из-за try_files
, что замедляет работу. Причина в том, что try_files
сначала проверяет файл на наличие, а затем принимает решение, переходить ли к следующему файлу или обслуживать.
Принимая во внимание, что rewrite
принимает безусловное решение о том, какой файл для обслуживания. (конечно, если у вас нет других директив, влияющих на это).
Вы также можете попытаться оптимизировать еще больше, не используя index
и используя rewrite
для домашней страницы. (помните, что index
также несет потери производительности проверки существования файла, как и try_files
).
Таким образом:
server {
server_name www.my-domain.com my-domain.com;
root /var/www/my-project/;
rewrite ^/(es|en|ca)$ /index_$1.html;
rewrite ^/$ /index_es.html;
# ...
}