Reputation: 558
Using next.js app deployed on firebase.
I have deployed the app already and using some time.
Solutions that I tried and didn't work:
"rewrites": [
{
"source": "/job/**",
"destination": "/job/[jobId]/index.html"
}
I found a ton of solutions for this problem but no one didn't work for me.
Any idea?
firebase.json file:
{
"hosting": {
"public": "out",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"cleanUrls": true,
"rewrites": [
{
"source": "**",
"destination": "out/index.html"
}
]
},
"functions": [
{
"source": "functions",
"codebase": "default",
"ignore": [
"node_modules",
".git",
"firebase-debug.log",
"firebase-debug.*.log"
],
"predeploy": ["npm --prefix \"$RESOURCE_DIR\" run build"]
}
]
}
Upvotes: 10
Views: 2014
Reputation: 18538
For dynamic routes to work, you have to use server functions. You can use experimental frameworks feature by Firebase.
Checkout - https://firebase.google.com/docs/hosting/nextjs
Next.js advanced (dynamic) routing does not work without server functions.
Follow these steps:
firebase.json
and .firebase
etc. And update firebase cli.firebase experiments:enable webframeworks
firebase init hosting
in the root directory of your Next.js app and follow the prompts.firebase deploy
Make sure you have paid plan activated so that functions can be creted by firebase-cli.
Try following
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
...
const router = useRouter();
useEffect(()=>{
if(location.pathname !== "/")
router.push(location.pathname)
}, [])
...
Checkout this repo for working example - working example Try navigating to https://byte-ceps.web.app/aboutOrAnything
// pages/index.jsx
import { useRouter } from "next/router";
import styles from "@/styles/Home.module.css";
import { useEffect } from "react";
export default function () {
const router = useRouter();
useEffect(() => {
if (location.pathname === "/") router.push("/home");
else router.push(location.pathname);
}, []);
// you can create custom loading animation / splash screen here
return (
<div>
<main className={styles.main}>
<h1> Loading... </h1>
</main>
</div>
);
}
move your landing page to /home
Deploy on vercel.com Simply create a vercel account and link it to your GitHub. Create project, select your GitHub repo and setup any secrets if you need to. You are done.
If you want to have your .web.app domain, you need to either redirect to vercel deployment from your firebase site or use iframe. But if you have already purchased your own domain name, you can simply setup cname entry and your deployment is ready.
Also in your firebase.json
shared in question, rewrite should be to /index.html
and not out/index.html
Upvotes: 4
Reputation: 753
To properly handle dynamic routes in Firebase hosting, you need to set cleanUrls: false
in your firebase.json
file and add a rewrite rule to handle all requests to index.html
:
The following will handle dynamic request correctly, however if you refresh it will take you to to the home page.
"cleanUrls": false,
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
You can fix this issue by adding a static directory rule to your firebase.json file:
"staticDirectory": [
{
"source": "/_next/static",
"destination": "/_next/static"
}
]
Full code:
// firebase.json
{
"hosting": {
"public": "out",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"cleanUrls": false,
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
],
"staticDirectory": [
{
"source": "/_next/static",
"destination": "/_next/static"
}
]
},
}
Upvotes: 0
Reputation: 11
This firebase.json works for me.
{
"hosting": {
"public": "out",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}
Upvotes: 0