2015-09-15 2 views
12

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

Вот моя конфигурация 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; 
} 
+0

У вас есть директива 'root' и' index.html'? Проверьте error.log –

+0

Да. Вопрос обновлен, чтобы включить его. –

+0

Ничего в моем журнале ошибок. –

ответ

16

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

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

Спасибо, получилось index.html не существует. Мне любопытно, почему вы говорите, что мне не нужна отправка или переадресация файлов cookie на стороне сервера? Кэш приложения HTML5 будет нежелательно сохранять весь новый кеш для каждого URL-адреса, поэтому единственным решением, которое я вижу, является то, что мне нужно установить cookie, перенаправить все запросы на '/' и затем перенаправить их в JavaScript на интерфейсе. –

+0

Можете ли вы использовать пули вместо виртуальных URL? Вместо 'http: // site/path1/path2/foo',' http: // site/# path1/path2/foo'. Это единственный способ, которым я могу думать, чтобы избежать дублирования кэширования приложений html5 или ужасно неэффективных внешних перенаправлений. – runningdogx

Смежные вопросы