There are guides and questions all over the place on how to do this, but never really a concrete answer that is satisfactory. Basically, I’m wondering if it’s possible to host a static SPA (HTML/CSS/JS) in GCP Cloud Storage.
The main caveat of this is that the SPA has its own routing system (ReactRouter) so I want all paths to be served by index.html.
Most guides will tell you to set the ErrorDocument to index.html
instead of 404.html
. While this is a clever hack, it causes the site’s HTTP response code to be 404 which is a disaster for SEO or monitoring tools. So that will work, as long as I can change the response code.
Is there any way to make this work? I have CloudFlare up and running too but from what I can tell there are no ways to trim the path or change the response status from there.
4
Answers
A good approach here is to use Google App Engine to host a static SPA. https://cloud.google.com/appengine/docs/standard/python/getting-started/hosting-a-static-website
You can use the app.yaml file to map urls to the static file. Here’s an example:
Documentation for app.yaml https://cloud.google.com/appengine/docs/standard/python/config/appref
One way to circumvent the problem is to use server-side rendering. In SSR all client requests are passed to a backend app so there’s no need for a Cloud Storage-hosted
index.html
.This of course comes with its own set of complications but we’re avoiding the above-mentioned 404 hack or resorting to any further dependencies like App Engine.
Alternatively you could go with hash-based routing, i.e. paths like
https://example.com/#some-path
.If you use Cloudflare, you can use a Cloudflare Worker to override the 404 status code, which comes from the Google Cloud Storage error page.
The code for the Worker should look like this:
I found it here in the Cloudflare community.
A very simple solution would be to just add the index.html file as the 404 fallback. This will always route everything to your single page app.