smithery/strataga

nextjs-request-url-proxy-redirect

Fix for NextResponse.redirect going to wrong host (localhost:8080) on Railway, Vercel, or containerized deployments. Use when: (1) redirects work locally but go to localhost in production, (2) console shows ERR_CONNECTION_REFUSED to for redirects in Next.js API routes or middleware. The fix is to use NEXT_PUBLIC_APP_URL environment variable instead of request.url as the base URL.

Installation

$ npx skills add smithery/strataga --skill nextjs-request-url-proxy-redirect

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from smithery/strataga.

npx skills add smithery/strataga

Browse all from smithery/strataga

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Skill metadata

Parsed from SKILL.md frontmatter.

Version1.0.0
Declared agents claude-code

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 3,988 B
  • docs SUMMARY.md 507 B

History

  1. First recorded snapshot · 0 installs

SKILL.md

Next.js request.url Returns Internal Proxy URL on Containerized Platforms

Problem

When deploying Next.js to Railway, Vercel, or similar containerized platforms, request.url in Edge runtime or API routes can return the internal proxy URL (e.g., http://localhost:8080) instead of the public domain (e.g., https://example.com).

This causes NextResponse.redirect(new URL(path, request.url)) to redirect users to the internal URL, which fails with ERRCONNECTIONREFUSED.

Context / Trigger Conditions

  • Symptom: Browser shows ERRCONNECTIONREFUSED to localhost:8080 or similar
  • Console errors: Failed to fetch RSC payload followed by connection refused
  • Network tab: Shows 307 redirect to https://localhost:8080/...
  • Environment: Next.js deployed to Railway, Vercel, Docker, or any reverse proxy setup
  • Code pattern: Using new URL('/path', request.url) for redirects

Solution

Replace request.url with an environment variable for the public URL:

// Before (broken on containerized platforms):
return NextResponse.redirect(
  new URL(`/not-found?code=${shortCode}`, request.url)
);

// After (works everywhere):
const baseUrl = process.env.NEXT_PUBLIC_APP_URL || "https://example.com";
return NextResponse.redirect(
  new URL(`/not-found?code=${shortCode}`, baseUrl)
);

For reusable code, create a helper:

const getBaseUrl = () =>
  process.env.NEXT_PUBLIC_APP_URL || "https://example.com";

Verification

  1. Deploy the fix to production
  2. Visit a URL that triggers the redirect
  3. Verify the redirect goes to the public domain, not localhost
  4. Check browser console for absence of ERRCONNECTIONREFUSED

Example

File: app/[shortCode]/route.ts

// Add helper at module level
const getBaseUrl = () =>
  process.env.NEXT_PUBLIC_APP_URL || "https://clicktowa.com";

export async function GET(request: NextRequest, { params }) {
  const { shortCode } = await params;
  const baseUrl = getBaseUrl();

  // ... lookup logic ...

  if (!link) {
    // Use baseUrl instead of request.url
    return NextResponse.redirect(
      new URL(`/not-found?code=${encodeURIComponent(shortCode)}`, baseUrl)
    );
  }

  // ... rest of handler
}

Notes

  • This issue occurs because containerized platforms route traffic through internal

load balancers/proxies. The request.url reflects the internal connection, not the original public request.

  • Some platforms set headers like X-Forwarded-Host or X-Original-Host, but

these aren't automatically used by request.url.

  • The NEXTPUBLIC prefix makes the variable available in both client and server

code, which is appropriate for the public URL.

  • Always provide a sensible fallback in case the env var isn't set.
  • This also affects request.headers.get('host') in some configurations—always

prefer explicit environment variables for public URLs.

Related Patterns

  • Auth callback URLs should also use NEXTPUBLICAPP_URL
  • OAuth redirect URIs need the public domain
  • Sitemap and robots.txt generation should use the env var
  • OpenGraph and canonical URLs should use the env var

References