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

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

вот моя конфигурация nginx. Я хочу, чтобы все запросы отправляли файл, если он существует, перенаправлять на мой API по адресу /auth и /api, и перенаправить все запросы к индексу.формат html. Почему следующее конфигурация, заставляющая мой браузер говорить, что есть цикл перенаправления? Если пользователь попадает в блок местоположения #2 и его маршрут не соответствует статическому файлу, он отправляется в блок местоположения #3, который перенаправит его на"/", который должен попасть в блок местоположения #1 и служить индексом.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 всегда внутренне перенаправляет эти запросы в @ location, который выполняет внешнее перенаправление.

Если у вас нет более сложной установки, чем вы изложили, я не думаю, что вам нужно делать так много. Вам не нужны внешние перенаправления (или даже внутренние перенаправления) или отправка файлов 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;
}