Конфигурация Nginx для одностраничного приложения с кэшем приложений HTML5

Я пытаюсь создать одностраничное приложение, использующее HTML5 App Cache, в котором будет кэшироваться вся новая версия приложения для каждого отдельного URL-адреса, поэтому я должен перенаправить всех на / и после этого мое приложение будет маршрутизировать их (это решение, используемое на devdocs.io).

Здесь моя конфигурация nginx. Я хочу, чтобы все запросы отправляли файл, если он существует, перенаправляют на мой API в /auth и /api и перенаправляют все остальные запросы в index.html. Почему следующая конфигурация заставляет мой браузер сказать, что существует цикл перенаправления? Если пользователь попадает в блок местоположения №2, а его маршрут не соответствует статическому файлу, он отправляется в блок №3, который перенаправляет его на "/", который должен попасть в блок №1 и служить index.html, правильно? Что вызывает цикл перенаправления здесь? Есть ли лучший способ сделать это?

root /files/whatever/public;
index index.html;

# If the location is exactly "/", send index.html.
location = / {
    try_files $uri /index.html;
}

location / {
    try_files $uri @redirectToIndex;
}

# Set the cookie of the initialPath and redirect to "/".
location @redirectToIndex {
    add_header Set-Cookie "initialPath=$request_uri; path=/";
    return 302 $scheme://$host/;
}

# Proxy requests to "/auth" and "/api" to the server.
location ~* (^\/auth)|(^\/api) {
    proxy_pass http://application_upstream;
    proxy_redirect off;
}

Ответ 1

В этом сообщении цикла указано, что /files/whatever/public/index.html не существует, поэтому try_files в location/не находит $uri, когда он равен /index.html, поэтому try_files всегда внутренне перенаправляет эти запросы к местоположению @, которое выполняет внешнее перенаправление.

Если у вас нет более сложной настройки, чем вы наметили, я не думаю, что вам нужно сделать так много. Вам не нужны внешние перенаправления (или даже внутренние переадресации) или отправка cookie на стороне сервера для однофайлового js-приложения. Соответствие регулярных выражений для app и api было не совсем правильным.

root /files/whatever/public;
index index.html;

location / {
    try_files $uri /index.html =404;
}

# Proxy requests to "/auth" and "/api" to the server.
location ~ ^/(auth|api) {
    proxy_pass http://application_upstream;
    proxy_redirect off;
}