HTML5アプリキャッシュを利用するシングルページアプリを構築しようとしています。これにより、個別のURLごとにアプリのまったく新しいバージョンがキャッシュされるため、全員を/
にリダイレクトし、後でアプリにルーティングさせる必要があります(これは devdocs.io )で使用されるソリューションです。
これが私の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;
}
このループメッセージは、/ files/whatever/public/index.htmlが存在しないことを示しているため、場所/のtry_filesは/index.html
と等しいときに$ uriを検出しないため、try_filesは常にこれらのリクエストを内部的にリダイレクトします。外部リダイレクトを行う@の場所へ。
概説したよりも複雑な設定がない限り、それほど多くのことをする必要はないと思います。 1ファイルのjsアプリの場合、外部リダイレクト(または内部リダイレクト)やサーバー側のCookie送信は必要ありません。アプリと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;
}