19

如何配置 nginx 以将所有 URL(未预先添加/api或某些静态资源,例如 JS/图像)重定向到index.html?原因是我在单页应用程序中使用 HTML5 推送状态 URL。意思是根据 URL 改变 AJAX 或 JS 的内容

我当前的 nginx 配置如下所示:

server {
    listen 2000;
    server_name localhost;

    location / {
        root    /labs/Projects/Nodebook/public;
        index   index.html;
    }

    location /api/ {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;

        proxy_pass http://localhost:3000/;
        proxy_redirect off;
    }
}
4

3 回答 3

23
location / {
  try_files $uri /index.html;
}

这将检查请求的文件是否存在并返回。如果文件不存在,它将返回 index.html。

http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files

于 2014-07-02T19:27:52.913 回答
6

mattes 答案几乎是一个解决方案,但是正如 aschepis 指出的那样,它不会为丢失的文件(例如 favicon.icon)提供 404。

Nginx 将选择第一个匹配的位置。所以我们可以先匹配文件(如果文件不存在会给出 404)。并且在为所有 url 放置一个默认为 index.html 的位置之后。

    location /.+\..+ { # files (assuming they always have a dot)
        # use eg alias to serve some files here
    }

    location / { # url routed by client, client gives 404 for bad urls
        try_files $uri /index.html;
    }
于 2015-08-21T10:12:04.987 回答
2

您需要添加到您的 nginx 配置文件:

 rewrite ^(.+)$ /index.html last;

然后假设您使用的是 Backbone.js,只需确保将任何未定义的路由重新路由到 404 页面:

  routes: {
    // Other routes
    "*path"  : "notFound"
  },

  notFound: function(path) {
    // Load 404 template, probably of a cute animal.
  }

来源: http ://readystate4.com/2012/05/17/nginx-and-apache-rewrite-to-support-html5-pushstate/

于 2013-04-05T11:22:04.157 回答