Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion bin/validate-redirects.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ async function main() {
let numInfiniteRedirects = 0;
let numUrlsWithFragment = 0;
let numDuplicateRedirects = 0;
let numNonSlashedRedirects = 0;

const validEndings = ["/", "*", ".xml", ".md", ".json", ".html"];

const redirectSourceUrls: string[] = [];

Expand All @@ -24,6 +27,11 @@ async function main() {
numUrlsWithFragment++;
}

if (!validEndings.some((ending) => from.endsWith(ending))) {
console.log(`✘ Found unslashed source URLs:\n ${from}`);
numNonSlashedRedirects++;
}

if (redirectSourceUrls.includes(from)) {
console.log(`✘ Found repeated source URL:\n ${from}`);
numDuplicateRedirects++;
Expand All @@ -32,7 +40,12 @@ async function main() {
}
}

if (numInfiniteRedirects || numUrlsWithFragment || numDuplicateRedirects) {
if (
numInfiniteRedirects ||
numUrlsWithFragment ||
numDuplicateRedirects ||
numNonSlashedRedirects
) {
console.log("\nDetected errors:");

if (numInfiniteRedirects > 0) {
Expand All @@ -47,6 +60,12 @@ async function main() {
console.log(`- ${numDuplicateRedirects} repeated source URL(s)`);
}

if (numNonSlashedRedirects > 0) {
console.log(
`- ${numNonSlashedRedirects} need slashes at the end of the source URL`,
);
}

console.log("\nPlease fix the errors above before merging :)");
process.exit(1);
} else {
Expand Down
15 changes: 7 additions & 8 deletions public/__redirects
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
# homepage
/api /api/ 301
/docs/ /directory/ 301
/products/ /directory/ 301
/zero-trust/ /products/?product-group=Cloudflare+One 301
Expand Down Expand Up @@ -401,6 +400,13 @@
# Constellation
/constellation/ /workers-ai/ 301

# Containers
/containers/image-management/ /containers/platform-details/image-management/ 301
/containers/scaling-and-routing/ /containers/platform-details/scaling-and-routing/ 301
/containers/architecture/ /containers/platform-details/architecture/ 301
/containers/durable-object-methods/ /containers/platform-details/durable-object-methods/ 301
/containers/platform-details/ /containers/platform-details/architecture/ 301

# D1
/d1/client-api/ /d1/worker-api/ 301
/d1/build-with-d1/d1-client-api/ /d1/worker-api/ 301
Expand Down Expand Up @@ -2435,10 +2441,3 @@
/ai-gateway/providers/* /ai-gateway/usage/providers/:splat 301
/ai-gateway/guardrails/* /ai-gateway/features/guardrails/:splat 301
/ai-gateway/websockets-api/* /ai-gateway/usage/websockets-api/:splat 301

# Containers
/containers/image-management /containers/platform-details/image-management 301
/containers/scaling-and-routing /containers/platform-details/scaling-and-routing 301
/containers/architecture /containers/platform-details/architecture 301
/containers/durable-object-methods /containers/platform-details/durable-object-methods 301
/containers/platform-details /containers/platform-details/architecture 301
Loading