web-dev-qa-db-ja.com

HTML5アプリキャッシュを使用したシングルページアプリのNginx構成

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;
}
14
winduptoy

このループメッセージは、/ 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;
}
24
runningdogx