Problem Summary
Requests from the Facebook crawler's real IP range (Meta AS32934) to a Next.js site deployed on Zeabur are receiving a 403 error from the Zeabur edge. Requests from general user IPs worldwide (TW / JP / US / BR / SG) using the same facebookexternalhit User-Agent to the same URL consistently return 200. This prevents link previews from generating for any articles posted to Facebook, Messenger, or Threads.
Impact
- Facebook Sharing Debugger returns 403 for all Zeabur-hosted URLs with the message: "This response code could be due to a robots.txt block."
- Posts fail to generate
og:title/og:description/og:imagepreviews, resulting in zero social sharing traffic. - The issue occurs on both the default
*.zeabur.appdomain and custom domains (even when proxied through Cloudflare), confirming the block occurs at the Zeabur edge proxy, after Cloudflare but before Next.js.
Affected Service
- Project ID:
6a0973851985c8ed80e2a779(leading-ai-lab) - Service ID:
6a09738e1985c8ed80e2a780 - Default domain:
https://leading-ai-lab.zeabur.app/ - Custom domain:
https://ai-lab.leadingmrk.com/ - Region: Linode-Tokyo (
server-6960eea5c73b56288f5791ef) - Framework: Next.js (Prebuilt V2)
Reproduction Steps
- Open https://developers.facebook.com/tools/debug/
- Enter
https://leading-ai-lab.zeabur.app/orhttps://ai-lab.leadingmrk.com/posts/paperclip-24h - Click "Scrape Again"
- The response code shows 403,
og:titlecannot be fetched, and Facebook displays the misleading message "possibly due to robots.txt block."
Evidence (Why it's the Zeabur edge, not the application layer)
Direct curl tests from multiple locations using the facebookexternalhit/1.1 UA all return 200:
curl -A "facebookexternalhit/1.1" https://leading-ai-lab.zeabur.app/
→ HTTP/2 200, x-nextjs-cache: HIT, x-powered-by: Next.js
robots.txtexplicitlyAllowsfacebookexternalhit / Facebot / meta-externalagent / meta-externalfetcher, and the application has correctog:*meta tags.- Direct access to
og:imagereturns 200 (content-type: image/png, including cache-control: public, max-age=31536000). - Cloudflare logs (on the custom domain layer) show no challenge/block events for the FB UA.
- Only requests originating from Meta's real IP range (AS32934) (i.e., FB Sharing Debugger) receive a 403.
→ Zeabur edge is directly rejecting the Meta ASN after Cloudflare and before Next.js.
Excluded Possibilities
- ✗
robots.txtblock — Content verified as Allow. - ✗ Next.js application block —
x-nextjs-cache: HITproves the application is still returning 200. - ✗ Cloudflare (custom domain layer) block — No records in Cloudflare WAF event log, and the default
*.zeabur.app(without client Cloudflare) also returns 403. - ✗ Browser Integrity Check / Bot Fight Mode (client Cloudflare) — Both disabled.
- ✗ Rate limit on user end — Facebook Debugger returns 403 even on a single manual scrape.
Root Cause Hypothesis
Zeabur edge proxy (located after Cloudflare and before the Next.js container) is applying some form of IP reputation / DDoS protection / rate-limit rule to Meta AS32934 / specific Facebook crawler IP ranges, causing a 403 before the request reaches the application layer.
Current Workaround
Added a Cache Rule on the client-side Cloudflare (cache_level=cache_everything, edge_cache_ttl=7200) to force-cache HTML responses for /posts/*, allowing the Facebook crawler to retrieve a 200 response directly from the Cloudflare edge cache without hitting Zeabur.
Problem: The default *.zeabur.app domain cannot be controlled via client Cloudflare and remains broken; this is a temporary bypass, not a permanent fix.
Requested Actions
We request the Zeabur engineering team to:
- Confirm if there are platform-level deny rules on the Zeabur edge for Meta AS32934 / Facebook crawler IP ranges.
- If so, please whitelist verified social crawler UAs such as
facebookexternalhit/Facebot/meta-externalagent/meta-externalfetcher, or provide a "Trusted Bots" toggle in the dashboard for customer management. - Additionally, we suggest that when the FB crawler is blocked, the system should return 503 +
Retry-Afterinstead of a vague 403, so FB knows to retry.
Thank you.