I quite like the approach of the new asp.net (asp.net 5\\core 1.0) web apps with the wwwroot folder being the root and only static files in there being served up.
Although OWIN worked for me in my dev environment running in VS 2017, it didn't work once deployed to azure. We run a SPA as well, and are storing the webpack output in ~/wwwroot/ but wanted it to load as if it was in the project root ~/ just like .net core webapi does it. I accomplished it by using just the URL rewrite shown below:
The first rule ensures that the file you are looking for doesn't exist in the root, isn't a folder, is found in the new path, isn't the wwwroot folder, nor is it part of the api. If ALL of those conditions are met, it tries to load the data from wwwroot.
The second rule checks to make sure you aren't trying to load the api, or a file that actually exists at the root. If both conditions are met, it loads the default SPA html document (in our case we use react).
Effectively this allows react-router 4 to handle all other routes after all the other conditions above have failed to find a match, and make it so it doesn't throw a 404 error when trying to load one of the react-router routes.