2015-09-15 18 views
12

HTML5 App Cacheを使用する単一のページアプリケーションを構築しようとしています。これは、異なるURLごとに新しいバージョンのアプリケーションをキャッシュするため、 /と私のアプリを後でルーティングしてください(これはdevdocs.ioで使用された解決策です)。HTML5 App Cacheを使用した単一ページアプリケーションのNginx設定

ここに私のnginx設定です。私はすべてのリクエストが存在する場合にはファイルを送信し、/auth/apiに私の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が存在していないことを示唆しているので、それは/index.htmlに等しいだときの場所にtry_filesは/ $ URIを見つけることができませんので、try_files常に内部外部のリダイレクトを行う@場所にそれらの要求をリダイレクトします。

あなたが概説したよりも複雑なセットアップをしていない限り、私はあなたがそれほど多くする必要はないと思います。 1ファイルのjsアプリケーション用に外部リダイレクト(または内部リダイレクト)やサーバー側のCookie送信は必要ありません。 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; 
} 
+0

ありがとう、index.htmlが存在しませんでした。なぜ私はサーバー側のクッキーの送信やリダイレクトを必要としないと言いたいのですか? HTML5 App CacheはすべてのURLのキャッシュを完全に保存するので、Cookieを設定し、すべてのリクエストを '/'にリダイレクトして、フロントエンドのJavaScript内で再ルーティングする必要があるという唯一の解決策があります。 –

+0

仮想URLの代わりにスラッグを使用できますか? 'http:// site/path1/path2/foo'の代わりに、' http:// site /#path1/path2/foo'を使用します。これは、html5アプリケーションのキャッシュを重複させたり、ひどく非効率な外部リダイレクトを避けるために考えられる唯一の方法です。 – runningdogx

関連する問題