Would it be possible to use pushState as the main mechanism on the client, and use a #! as a fallback? You would end up with two different possible URLs, but if the same library handles the calls then it would be fairly straightforward to move from one to the other.