Почему в директиве try_files отсутствует косая черта между корнем и именем файла? - PullRequest
4 голосов
/ 08 мая 2019

Я пытаюсь настроить Nginx для работы в качестве обратного прокси, но также обрабатывать одну статическую страницу (приветствие) самостоятельно:

root /usr/share/project/;
location = / {
    try_files index.html =404;
}

Эта конфигурация всегда возвращает 404. Когда я пытаюсь выяснить, что именно происходит, я переписываю директиву try_files, чтобы она перестала работать:

try_files index.html index.html;

И был удивлен увиденным в error.log:

2019/05/07 17:30:39 [ошибка] 9393 # 9393: * 1 open () "/usr/share/projectindex.html" не удалось (2: нет такого файла или каталога), клиент: 10.25. 88.214, сервер:, запрос: "GET /index.html HTTP / 1.1"

Как видите, имя файла результатов - projectindex.html. Слэш пропустил. Я пытаюсь добавить / и ./ в разных местах, но это ни к чему не привело.

Наконец, я заменяю свою конфигурацию следующим:

root /usr/share/project/;
location = / {
    try_files /index.html =404;
}
location = /index.html {
}

и это работает.

Я не понимаю, что не так с первым конфигом. А также я не понимаю значение пустого места:

location = /index.html {
}

и почему он работает правильно.

Может быть, есть лучший способ сделать то же самое?

1 Ответ

1 голос
/ 08 мая 2019

root может опционально принимать трейлинг / - это не имеет значения и игнорируется.

Файл элементов оператора try_files (как и для всехURI в Nginx) требуют ведущего /.Подробнее см. в этом документе .

Например:

root /usr/share/project;
location = / {
    try_files /index.html =404;
}
location / {
    proxy_pass ...;
}

Это работает, потому что URI внутренне переписан в /index.html и обработан в том же location .


Если вы используете директиву index, URI внутренне переписывается в /index.html, и Nginx будет искать подходящее местоположение для обработки запроса.В этом случае вам нужно другое местоположение для обработки запроса.

Например:

root /usr/share/project;
location = / {
    index index.html;
}
location = /index.html {
}
location / {
    proxy_pass ...;
}

Пустой блок местоположения наследует значение root от внешнего блока.В любом случае, оператор index является значением по умолчанию, поэтому, строго говоря, вам также не нужно указывать этот оператор.Обратите внимание, что значения директивы index не требуют начального /.Подробнее см. в этом документе .

...