nginxbackbone.jsurl-rewritingpushstate

Rewriting nginx for pushState-URL's


I am trying to get nginx to work with my pushState-based URI handling that backbone.js manages for me in an Javascript app.

Right now accessing URI's with one level, eg. example.com/users works well, but not two-level or deeper URI's, such as example.com/users/all, which is mentioned in the Backbone documentation:

For example, if you have a route of /documents/100, your web server must be able to serve that page, if the browser visits that URL directly

So, being far from acquainted with nginx's rewrite options, I am still sure that I can do something like rewrite ^ /index.html; to redirect everything to my index.html, but loosing out on any eventual static files (images, javascript & css) stored on the same server which I need to be able to access.

So what should I do instead with the below shown, current configuration, to make this work?

server {
    listen   80;
    server_name  example.com;

    location / {
        root   /var/www/example.com;
        try_files $uri /index.html;
    }

}

Solution

  • Here is what i did to my application. Every route ending with a '/' (except the root it self) will serve index.html :

      location ~ ^/.+/$ {
        rewrite .* /index.html last;
      }
    

    You can also prefix your route :

    Backbone.history.start({pushState: true, root: "/prefix/"})
    

    and then :

      location ~ ^/prefix/ {
        rewrite .* /index.html last;
      }
    

    Or define a rule for each case.