Конфигурация 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;
}