Redirect 带有HTML5应用缓存的单页应用的Nginx配置

Redirect 带有HTML5应用缓存的单页应用的Nginx配置,redirect,nginx,single-page-application,html5-appcache,Redirect,Nginx,Single Page Application,Html5 Appcache,我正在尝试构建一个利用HTML5应用缓存的单页应用程序,它将为每个不同的URL缓存一个全新版本的应用程序,因此我必须将每个人重定向到/,然后让我的应用程序将其发送(这是在上使用的解决方案) 这是我的nginx配置。我希望所有请求发送一个文件(如果存在),重定向到位于/auth和/API的我的API,并将所有其他请求重定向到index.html。为什么以下配置导致我的浏览器显示存在重定向循环?如果用户点击位置块#2,并且他的路径与静态文件不匹配,他将被发送到位置块#3,这将把他重定向到“/”位置块

我正在尝试构建一个利用HTML5应用缓存的单页应用程序,它将为每个不同的URL缓存一个全新版本的应用程序,因此我必须将每个人重定向到
/
,然后让我的应用程序将其发送(这是在上使用的解决方案)

这是我的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;
}

该循环消息表明/files/whatever/public/index.html不存在,因此当$uri等于
/index.html
时,location/中的try_文件找不到$uri,因此try_文件总是在内部将这些请求重定向到执行外部重定向的@location

除非你有一个比你概述的更复杂的设置,我认为你不需要做这么多。对于单文件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;
}

您是否有
root
指令和
index.html
文件?检查error.logYes。问题更新为包含它。我的错误日志中没有任何内容。您是否检查了
curl
(或
wget
)?可能是您的浏览器缓存了错误的重定向…
curl
给了我一些nginx HTML
302,找到了
nginx/1.8.0
wget
说“超过了20个重定向”。这里没有缓存问题。谢谢,原来index.html不存在。我很好奇为什么你说我不需要服务器端cookie发送或重定向?HTML5应用缓存将不希望为每个URL保存一个全新的缓存,因此我看到的唯一解决方案是,我需要设置cookie,将所有请求重定向到
/
,然后在前端的JavaScript中重新路由它们。你能用slug代替虚拟URL吗?而不是
http://site/path1/path2/foo
http://site/#path1/path2/foo
。这是我能想到的避免重复html5应用缓存或效率极低的外部重定向的唯一方法。