2015-09-15 14 views
12

Próbuję zbudować pojedynczą aplikację strony, która będzie korzystać z pamięci podręcznej aplikacji HTML5, która będzie buforować całą nową wersję aplikacji dla każdego odrębnego adresu URL, dlatego muszę przekierować wszystkich do / i moja aplikacja będzie je potem trasować (jest to rozwiązanie używane na devdocs.io).Konfiguracja Nginx dla aplikacji jednostronicowej z pamięcią podręczną HTML5

Oto moja konfiguracja nginx. Chcę, aby wszystkie żądania wysłały plik, jeśli istnieje, przekierowuję do mojego interfejsu API pod numer /auth i /api i przekierowuję wszystkie inne żądania do index.html. Dlaczego poniższa konfiguracja powoduje, że moja przeglądarka mówi, że istnieje pętla przekierowania? Jeśli użytkownik trafi blokadę nr 2, a jego trasa nie pasuje do pliku statycznego, jest on wysyłany do bloku lokalizacji nr 3, który przekieruje go do "/", który powinien trafić blok lokalizacji nr 1 i służyć index.html, prawda? Co powoduje tutaj pętlę przekierowania? Czy istnieje lepszy sposób na osiągnięcie tego?

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

Czy masz dyrektywę root i plik index.html? Sprawdź error.log –

+0

Tak. Pytanie zaktualizowane, aby je uwzględnić. –

+0

Nic w moim dzienniku błędów. –

Odpowiedz

16

Ten komunikat wskazuje, że pętla /files/whatever/public/index.html nie istnieje, więc try_files w miejscu/nie znajdzie $ uri gdy jest równa /index.html, więc try_files zawsze wewnętrznie przekierowuje te żądania do @ lokalizacji, która wykonuje zewnętrzne przekierowanie.

Jeśli nie masz bardziej skomplikowanej konfiguracji niż opisałeś, nie sądzę, że musisz zrobić tak wiele. Nie powinieneś potrzebować zewnętrznych przekierowań (lub nawet przekierowań wewnętrznych) lub wysyłania plików cookie po stronie serwera dla aplikacji JS. Dopasowanie do wyrażenia regularnego dla aplikacji i interfejsu API również nie było odpowiednie.

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

Dzięki, okazało się, że index.html nie istnieje. Ciekawi mnie, dlaczego mówisz, że nie potrzebuję wysyłania lub przekierowania cookie po stronie serwera? Pamięć podręczna aplikacji HTML5 będzie w sposób niepożądany zapisywać zupełnie nową pamięć podręczną dla każdego adresu URL, więc jedyne rozwiązanie, jakie widzę, to konieczność ustawienia pliku cookie, przekierowania wszystkich żądań do '/', a następnie przekierowania ich w JavaScript na interfejsie. –

+0

Czy można używać wtyczek zamiast wirtualnych adresów URL? Zamiast 'http: // site/path1/path2/foo',' http: // site/# path1/path2/foo'. Jest to jedyny sposób uniknięcia zduplikowanego buforowania aplikacji html5 lub okropnie nieefektywnego przekierowania zewnętrznego. – runningdogx