【问题标题】:Configuring nginx for single page website with HTML5 push state URL's使用 HTML5 推送状态 URL 为单页网站配置 nginx
【发布时间】:2012-11-28 13:13:33
【问题描述】:

如何配置 nginx 以将所有 URL(不以 /api 或某些静态资源(例如 JS/图像)开头)重定向到 index.html?原因是我在单页应用程序中使用 HTML5 推送状态 URL。无论是 AJAX 还是 JS,含义内容都会根据 URL 进行更改

我当前的 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;
    }
}

【问题讨论】:

    标签: html nginx singlepage


    【解决方案1】:
    location / {
      try_files $uri /index.html;
    }
    

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

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

    【讨论】:

    • 这不会消除您为合法不存在的东西发送 404 的能力(例如,如果您忘记包含 favicon.ico,它会返回您的 index.html 吗?!)
    • @aschepis:没错。如果 favicon.ico 丢失,请不要忘记 favicon.ico 或创建专用规则以返回 404。或您需要单独处理的任何其他文件。
    【解决方案2】:

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

    【讨论】:

    • 如果网址为example.com/users/my.name,则此方案无效。
    • 第一个匹配位置有点模糊。一个很好的指南是digitalocean.com/community/tutorials/… 向下滚动到匹配的位置块部分
    • @alexrogins 你是什么意思?它是 . 的模式匹配,并假定点表示文件。您可以用适合您的上下文的任何内容替换该模式。
    • @j-抱歉,我的评论不是很清楚。因此,我在 RTFM 之前阅读了您的答案,而我从 Nginx 将选择第一个匹配的位置 从您的回答中得到的是它在列表中出现并选择第一个匹配的位置。优先级比看起来要复杂得多。
    • @alexrogins 我明白了,是的,如果您有其他位置可能需要调整。在上面,它将两者都视为前缀并选择匹配的较长的一个。因此,如果这是正确的,那么顺序应该无关紧要。如果你尝试请告诉我:)
    【解决方案3】:

    你需要添加到你的 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/

    【讨论】:

    • 虽然这有效,但您将无法访问真正存在的常规文件。
    • true @mattes 这是我发现从客户端部分修复它的一种非常糟糕的方法。应该在 Nginx 级别更好地解决您提到的更多规则来处理您提到的案例。
    猜你喜欢
    • 1970-01-01
    • 2014-11-26
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多