Michelle's answer is correct but there is more to it. In addition to setting HTML5 mode to true in Angular, you need to enable the server-side rewrites.
The problem occurs when the user refreshes a page or paste a URL directly. This is because the browser has no way of knowing that this is not a real URL. In other words, without the hash character in the URL, it takes it as a literal URL and attempts to navigate there when the user does a refresh. In this scenario, it just sends the GET request to the server like this...
GET http://localhost/currencies/10
and the server responds with this message...
Cannot GET /currencies/10
From the Angular documentation... Using the html5mode mode requires URL rewriting on server side, basically you have to rewrite all your links to entry point of your application (e.g. index.html).
This means that you need a setup on your server that automatically redirects the user to your Angular index page, so that the Angular routing can take over from there. On the other hand, if you use the # symbol, it requires no server side configuration.
To allow for this, you need to write a catch-all route in your Node/Express web server as follows:
app.get('/*', function(req, res) {
res.sendfile('index.html');
});
This means that before each request gets to your Angular app, it has to pass first through the server-side routing, which should rewrite all requests to point to index.html which is the Angular app's entry point.