2015-09-15 6 views
12

Ich versuche eine einzelne Seite App zu erstellen, die HTML5 App Cache verwendet, die eine völlig neue Version der App für jede einzelne URL zwischenspeichern wird, also muss ich jeden umleiten / und von meiner App später weiterleiten lassen (dies ist die Lösung, die unter devdocs.io verwendet wird).Nginx config für Single Page App mit HTML5 App Cache

Hier ist mein Nginx Config. Ich möchte, dass alle Anfragen eine Datei senden, wenn sie existiert, umleiten an meine API unter /auth und /api und alle anderen Anfragen an index.html umleiten. Warum bewirkt die folgende Konfiguration, dass mein Browser sagt, dass eine Umleitungsschleife vorhanden ist? Wenn der Benutzer den Standortblock Nr. 2 trifft und seine Route nicht mit einer statischen Datei übereinstimmt, wird er an den Standortblock Nr. 3 gesendet, der ihn an "/" weiterleitet, was den Standortblock Nr. 1 treffen und index.html bedienen soll, richtig? Was verursacht die Umleitungsschleife hier? Gibt es einen besseren Weg, dies zu erreichen?

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

Haben Sie 'root' Direktive und' index.html' Datei? Überprüfen Sie error.log –

+0

Ja. Frage aktualisiert, um es aufzunehmen. –

+0

Nichts in meinem Fehlerprotokoll. –

Antwort

16

Diese Schleife Nachricht schlägt vor, dass /files/whatever/public/index.html nicht vorhanden ist, so dass die try_files in Lage/nicht $ uri zu finden, wenn es um /index.html gleich ist, so dass die try_files immer intern Leitet diese Anfragen an den @ Standort weiter, der die externe Weiterleitung ausführt.

Es sei denn, Sie haben eine kompliziertere Konfiguration als Sie beschrieben haben, ich glaube nicht, dass Sie so viel tun müssen. Sie sollten keine externen Weiterleitungen (oder sogar interne Weiterleitungen) oder serverseitigen Cookie-Senden für eine Ein-Datei-Js-App benötigen. Die Regex-Übereinstimmung für App und API stimmte ebenfalls nicht.

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

Danke, stellte sich heraus index.html hat nicht existiert. Ich bin neugierig, warum Sie sagen, ich brauche keine serverseitigen Cookie-Senden oder Redirects? Der HTML5 App Cache speichert unerwünschterweise einen neuen Cache für jede URL. Die einzige Lösung, die ich sehe, ist, dass ich den Cookie setzen, alle Anfragen an '/' umleiten und dann innerhalb des JavaScript auf dem Frontend umleiten muss. –

+0

Können Sie Slugs anstelle von virtuellen URLs verwenden? Statt "http: // Site/Pfad1/Pfad2/Foo", "http: // Site/# Pfad1/Pfad2/Foo". Das ist die einzige Möglichkeit, die ich mir vorstellen kann, um doppelte HTML5 App-Zwischenspeicherung oder schrecklich ineffiziente externe Weiterleitungen zu vermeiden. – runningdogx

Verwandte Themen