Я использую Nginx для сервера одностраничного приложения.По сути, нам просто нужно обслуживать страницу index.html
всякий раз, когда не найден соответствующий файл.Расположение выглядит следующим образом и работает нормально:
location / {
try_files $uri $uri/ /index.html
}
Теперь я хотел бы запросить вышестоящий сервер, и только в случае сбоя используйте директиву try_files
, как указано выше
Если try_files
просто перемещен в резервное положение, такое как
location @fallback {
try_files $uri $uri/ /index.html;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_intercept_errors on;
error_page 400 403 502 503 504 @fallback;
}
, тогда - когда вышестоящий сервер недоступен - клиент видит страницу ошибки Nginx 502 вместо файлов, подаваемых из файловой системы.
Наконец-то я нашел решение, которое работает с использованием двойной косой черты перед отступом /index.html.Это весь файл конфигурации, который можно использовать с официальным образом докера nginx для тестирования
events {
}
http {
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
server {
listen 80;
root /usr/share/nginx/html/;
location / {
proxy_pass http://127.0.0.1:9990;
proxy_intercept_errors on;
error_page 400 403 502 503 504 = @fallback;
}
location @fallback {
try_files $uri?$args /index.html //index.html;
}
}
}
, который можно запустить с помощью команды, подобной
docker run -v /path/to/www/folder:/usr/share/nginx/html:ro -v /path/to/config/nginx.conf:/etc/nginx/nginx.conf -d -p 8080:80 nginx
В случае, если двойная косая черта не установленаприсутствует перед последним index.html
отступлением, например
location @fallback {
try_files $uri?$args /index.html;
}
Затем nginx создает путь в файловой системе, например <root>index.html
, в котором вместо правильного <root>/index.html
вместо пропущенного *1025* указывается пропущенный символзапрашивается корневой URL.
Последний вопрос: почему для этой настройки требуется двойной слеш в директиве try_files?Почему нельзя просто использовать раздел try_files из обычной конфигурации и переместить его в резервное место, используемое при перехвате ошибок?