-
Notifications
You must be signed in to change notification settings - Fork 789
fix: Handle Next.js external URL rewrites to prevent 504 Gateway Timeout #486
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
- Introduced caching for external rewrites from the routes manifest. - Implemented functions to load and handle external URL rewrites, ensuring proper proxying in Cloud Functions. - Enhanced request handling to support external rewrites before processing by Next.js.
Summary of ChangesHello @chalosalvador, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! This pull request resolves a critical issue where Next.js applications deployed on Firebase Hosting would encounter 504 Gateway Timeout errors when attempting external URL rewrites. The problem stemmed from Next.js's internal Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request provides a solid fix for the 504 Gateway Timeout issue affecting Next.js external URL rewrites on Firebase Hosting. The approach of intercepting and proxying these requests with fetch before they reach Next.js's problematic internal proxy is well-reasoned and effectively addresses the root cause. The implementation is clean and includes helpful comments. I've included a few suggestions to enhance error handling and improve performance.
Description
Problem
Next.js external URL rewrites (rewrites to
http://orhttps://destinations) fail with 504 Gateway Timeout when deployed to Firebase Hosting.Related issues:
Example configuration that fails:
Root Cause
In
incomingMessageFromExpress(), a newSocket()is created which is disconnected (has no network connection):When Next.js handles external rewrites, it uses
http-proxyinternally, which relies on the socket to pipe the response back to the client. With a disconnected socket, the response cannot be delivered, causing the request to hang until Cloud Functions times out (504).Solution
Intercept external URL rewrites before they reach Next.js's internal
http-proxy. The newhandleExternalRewrite()function:routes-manifest.jsonto identify external rewritesfetch()(which doesn't depend on socket state)content-encoding,transfer-encoding,content-lengthto avoid decompression issues)res.send()This bypasses the broken code path entirely while maintaining full compatibility with Next.js rewrite semantics.
Changes
src/next.js/index.ts: AddedhandleExternalRewrite()function and external rewrite interception in thehandle()exportTesting
Deploy to Firebase Hosting with
firebase deployTest the proxy endpoint:
Expected: Returns JSON from jsonplaceholder API
Before fix: 504 Gateway Timeout after ~60 seconds