/api-keys shares a raw string prefix with /api, and the proxies in front of this app do not all match by path segment. Nginx Proxy Manager routes /api straight to the Go server with a prefix location, so /api-keys never reached Next at all — it reached a control plane with no such route and came back as a JSON 404. Traefik's PathPrefix has the same shape of matcher, which puts the Helm ingress at risk whenever ingress.api.enabled is on. The page is /tokens now, which cannot collide with anything, and which matches the /api/tokens the REST API already publishes. The sidebar still says API Keys — the label is for the reader, the path is for the router. A permanent redirect covers anyone who bookmarked the old path today. Fixing the proxy config instead would have left the trap set for the next deployment, and for whatever sits in front of it.
56 lines
1.8 KiB
TypeScript
56 lines
1.8 KiB
TypeScript
import type { NextConfig } from "next";
|
|
|
|
// Read at runtime, not baked in. The rewrites below run in the Next server
|
|
// process, never in the browser, so this never needed the NEXT_PUBLIC_ prefix
|
|
// that pins a value into the image at build time. NEXT_PUBLIC_API_URL is still
|
|
// honoured so an existing deployment passing it keeps working.
|
|
const apiUrl = process.env.API_URL ?? process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:8080";
|
|
|
|
const nextConfig: NextConfig = {
|
|
output: "standalone",
|
|
async redirects() {
|
|
return [
|
|
{
|
|
// The API keys page briefly lived at /api-keys, which every
|
|
// raw-prefix proxy in front of this app captures with its /api
|
|
// rule — nginx's `location /api` matches /api-keys, so the
|
|
// request reached the Go server and 404'd. The page is at
|
|
// /tokens now precisely because that cannot happen to it.
|
|
source: "/api-keys",
|
|
destination: "/tokens",
|
|
permanent: true,
|
|
},
|
|
];
|
|
},
|
|
async rewrites() {
|
|
return [
|
|
{
|
|
source: "/api/:path*",
|
|
destination: `${apiUrl}/api/:path*`,
|
|
},
|
|
{
|
|
source: "/auth/:path*",
|
|
destination: `${apiUrl}/auth/:path*`,
|
|
},
|
|
{
|
|
source: "/install",
|
|
destination: `${apiUrl}/install`,
|
|
},
|
|
{
|
|
source: "/install.ps1",
|
|
destination: `${apiUrl}/install.ps1`,
|
|
},
|
|
{
|
|
source: "/update",
|
|
destination: `${apiUrl}/update`,
|
|
},
|
|
{
|
|
source: "/update.ps1",
|
|
destination: `${apiUrl}/update.ps1`,
|
|
},
|
|
];
|
|
},
|
|
};
|
|
|
|
export default nextConfig;
|