Use custom domain for firebase function http calls

I have contacted firebase support to get some answers about this. And I was forwarded to this part in the documentation.

https://firebase.google.com/docs/hosting/functions#create_an_http_function_to_your_hosting_site

You can use your own domain with the firebase-cloud-functions. The way to do is is using the firebase-hosting.

  1. Connect custom domain to firebase hosting
  2. Add custom function routing to firebase.json

    {
      "hosting": {
        "public": "public",
    
        // Add the following rewrites section *within* "hosting"
        "rewrites": [{
          "source": "/bigben", "function": "bigben"
        }]
    
      }
    }
    
  3. Deploy to firebase


The accepted answer is correct, and I created this repository last year to demonstrate the functionality: https://github.com/cjmyles/firebase-react-express

In order to retain the HTML pushState functionality as per https://firebase.google.com/docs/hosting/full-config#rewrites you may want to extend the rules to allow all other requests through to your index.html page, which solves the issue @Boris was facing in his answer.

"rewrites": [
    {
        "source": "/api/**",
        "function": "app"
    },
    {
        "source": "!/@(api)/**",
        "destination": "/index.html"
    }
]

This shouldn't really be needed as the rewrite rules are meant to match the first occurence of a request (so the order matters), but this worked for me by allowing all non-api related requests through.

Please note: At the time of writing this the Firebase documentation states: Firebase Hosting supports Cloud Functions in us-central1 only.


If anyone else runs into this, Thomas Bulva's answer is correct but for me, I also had to remove the below snippet from the firebase.json file. .

It was redirecting any request to the index.html page. My https://us---<>.cloudfunctions.net URL was working fine; when I did /helloWorld it would take me to "Hello from Firebase!" But if I tried the same from my custom domain, it would fail. Removing this fixed it.

{
   "source": "**",
   "destination": "/index.html"
},