Back to square one, both /product/really-cool-product and /product/another-cool-product paths are required. This problem is not unique to Vaadin, but common to all server- and client-side SPA frameworks. What is required is:

To have the client change the browser’s URL with no server interaction - no page reload nor AJAX calls To have the server handle paths

In JavaScript, the answer is to use the History API. I assume everyone is familiar with the following snippet:

window . back (); window . go ( - 1 );

This is however absolutely not standard. This should be replaced by the following:

window . history . back (); window . history . go ( - 1 );

The history object implements the History API. In particular, it API makes it possible to add entries in the browser history via the pushState() method.

Suppose http://mozilla.org/foo.html executes the following JavaScript: var stateObj = { foo : " bar " }; history . pushState ( stateObj , " page 2 " , " bar.html " ); This will cause the URL bar to display http://mozilla.org/bar.html, but won’t cause the browser to load bar.html or even check that bar.html exists. — Mozilla Developer Network