Redirect direct visits to coverage-compass-policy-engine.vercel.app to policyengine.org
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Accessibilité débutants
- 55/100
- Type d'issue
- Fonctionnalité
- Clarté
- Clairement spécifiée
- Activité
- Active
- Stack technique
- next.js, typescript
Piste de recherche
Start with frontend/next.config.ts, then inspect frontend/src/app/layout.tsx, frontend/public/sitemap.xml and frontend/public/robots.txt for the current URLs. Check for absolute calls to the Vercel host and follow the linked redirect guidance and tests. Done means direct-host requests redirect to the canonical policyengine.org URLs while proxied requests still work; the issue also calls for a production curl check and an audit update in policyengine-app-v2.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
policyengine.org serves this app at https://www.policyengine.org/us/coverage-compass: policyengine-app-v2's website/src/data/appZoneRoutes.ts proxies that path to https://coverage-compass-policy-engine.vercel.app. The host also serves every page itself, outside the site, so links to it keep turning up in posts, emails and READMEs. A visit straight to coverage-compass-policy-engine.vercel.app should land on the same page on policyengine.org.
The change
In frontend/next.config.ts, add three redirects. as const keeps the condition's type the literal "header": without it TypeScript widens it to string, which Next 16's NextConfig type rejects (TS2322, checked on Next 16.2.6).
const PUBLIC_URL = "https://www.policyengine.org/us/coverage-compass";
const directVisit = [
{ type: "header" as const, key: "x-forwarded-host", value: "coverage-compass-policy-engine\\.vercel\\.app" },
];
// in nextConfig:
async redirects() {
return [
// The host's root, outside the basePath.
{ source: "/", basePath: false, has: directVisit, destination: PUBLIC_URL, permanent: true },
// The bare basePath. Without this rule Vercel sends it to PUBLIC_URL + "/", a second hop.
{ source: "/", has: directVisit, destination: PUBLIC_URL, permanent: true },
{ source: "/:path*", has: directVisit, destination: `${PUBLIC_URL}/:path*`, permanent: true },
];
},
Vercel sets x-forwarded-host to the host the visitor asked for, and overwrites any value the visitor sends. That's coverage-compass-policy-engine.vercel.app on a direct visit and www.policyengine.org on a request policyengine.org proxies. So these rules leave policyengine.org's own requests alone, and preview deployments too, since a preview has a host of its own. The pattern, how it was tested and its pitfalls: policyengine-app-v2 docs, "The direct-host redirect". PolicyEngine/ballot-measures-2026#8 adopts it with tests.
Canonical link and og:url
Once the host redirects, a page whose <link rel="canonical"> or og:url names coverage-compass-policy-engine.vercel.app names a URL that redirects back to it, and policyengine-app-v2's audit fails a redirecting zone whose page does. Today this page's canonical link and og:url name https://coverage-compass.policyengine.org, a subdomain that no longer resolves (checked 2026-10-29): frontend/src/app/layout.tsx sets it as metadataBase and in the JSON-LD, and frontend/public/sitemap.xml and frontend/public/robots.txt use it too. In the same change, point the canonical link and og:url at https://policyengine.org/us/coverage-compass, and the JSON-LD, sitemap and robots.txt at URLs under it.
Assets and API calls
These rules also redirect direct requests for the host's own assets and API routes. Pages served through policyengine.org load theirs through policyengine.org, so readers there never meet the redirect. But a browser blocks a cross-origin call whose redirect carries no CORS headers, so check that no code calls this host by absolute URL. A code search of the default branch for coverage-compass-policy-engine.vercel.app found nothing (2026-10-29).
Check it
/us/coverage-compass already serves this app on policyengine.org, so this can ship whenever it suits you. After the production deploy:
curl -sI "https://coverage-compass-policy-engine.vercel.app/us/coverage-compass"
That should answer 308 with location: https://www.policyengine.org/us/coverage-compass, and curl -sI "https://www.policyengine.org/us/coverage-compass" should still answer 200.
Then, in policyengine-app-v2, run node .github/scripts/audit-zone-direct-hosts.mjs, and add "/us/coverage-compass" to DIRECT_HOST_REDIRECTS there so the daily audit keeps the redirect in place.
🤖 Generated with Claude Code
- Langage dominant
- TypeScript
- Étoiles
- 1
- Forks
- 0
- Merge moyen
- 2 h 1 min
- PR mergées (30 j)
- 1
Préparer son environnement
- Fournit un Dockerfile ou un fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Issues similaires
-
area: build-and-ci S3: minor
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
manaflow-ai/cmux#39902 ·
Les mainteneurs répondent en général sous 1 jour
-
bug
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
refined-github/refined-github#10387 ·
Les mainteneurs répondent en général sous 1 jour
-
documentation
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
CopilotKit/CopilotKit#8283 · 1 commentaire ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
-
complexity:simple priority:P3 ready-to-build
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
junruxiong/IncarnaMind#2919 ·