Skip to content

Commit 1a63d7a

Browse files
authored
feat(seo): harden app-router metadata and GEO signals (#832)
1 parent a185863 commit 1a63d7a

21 files changed

Lines changed: 2089 additions & 2301 deletions

SortVision/.typos.toml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
[files]
2+
extend-exclude = [
3+
"public/code/**",
4+
"src/locales/**",
5+
"src/components/chatbot/ChatAssistant.jsx",
6+
"src/components/chatbot/assistantEngine/templates/localizedHelp.js",
7+
"src/utils/seo/data.js",
8+
"src/utils/seo/meta.js",
9+
]
10+
11+
[default.extend-words]
12+
DAA = "DAA"

SortVision/middleware.js

Lines changed: 9 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -37,28 +37,21 @@ export function middleware(request) {
3737
if (pathname !== '/' && !isLanguageRoot && pathname.endsWith('/')) {
3838
const url = request.nextUrl.clone();
3939
url.pathname = pathname.slice(0, -1);
40-
const response = NextResponse.redirect(url, 308); // Use 308 to preserve method
41-
// Prevent search engines from indexing redirect URLs
42-
response.headers.set('X-Robots-Tag', 'noindex, nofollow');
43-
return response;
40+
return NextResponse.redirect(url, 308); // Use 308 to preserve method
4441
}
4542

4643
// Redirect invalid URLs
4744
if (pathname === '/$' || pathname === '/%24') {
4845
const url = request.nextUrl.clone();
4946
url.pathname = '/';
50-
const response = NextResponse.redirect(url, 301);
51-
response.headers.set('X-Robots-Tag', 'noindex, nofollow');
52-
return response;
47+
return NextResponse.redirect(url, 301);
5348
}
5449

5550
// Redirect /jp to /ja (Japanese language code fix)
5651
if (pathname === '/jp' || pathname.startsWith('/jp/')) {
5752
const url = request.nextUrl.clone();
5853
url.pathname = pathname.replace(/^\/jp(\/|$)/, '/ja$1');
59-
const response = NextResponse.redirect(url, 301);
60-
response.headers.set('X-Robots-Tag', 'noindex, nofollow');
61-
return response;
54+
return NextResponse.redirect(url, 301);
6255
}
6356

6457
// Handle language-specific paths
@@ -72,9 +65,7 @@ export function middleware(request) {
7265
) {
7366
const url = request.nextUrl.clone();
7467
url.pathname = '/' + pathParts.slice(1).join('/');
75-
const response = NextResponse.redirect(url, 301);
76-
response.headers.set('X-Robots-Tag', 'noindex, nofollow');
77-
return response;
68+
return NextResponse.redirect(url, 301);
7869
}
7970

8071
// Algorithms legacy redirect: /algorithms/:algorithm -> /algorithms/config/:algorithm
@@ -97,9 +88,7 @@ export function middleware(request) {
9788
) {
9889
const url = request.nextUrl.clone();
9990
url.pathname = `/algorithms/config/${pathParts[1].toLowerCase()}`;
100-
const response = NextResponse.redirect(url, 301);
101-
response.headers.set('X-Robots-Tag', 'noindex, nofollow');
102-
return response;
91+
return NextResponse.redirect(url, 301);
10392
}
10493

10594
// Handle language-prefixed legacy paths: /es/algorithms/bubble
@@ -111,18 +100,14 @@ export function middleware(request) {
111100
) {
112101
const url = request.nextUrl.clone();
113102
url.pathname = `/${pathParts[0]}/algorithms/config/${pathParts[2].toLowerCase()}`;
114-
const response = NextResponse.redirect(url, 301);
115-
response.headers.set('X-Robots-Tag', 'noindex, nofollow');
116-
return response;
103+
return NextResponse.redirect(url, 301);
117104
}
118105

119106
// Handle contribution redirects
120107
if (pathname === '/contributions') {
121108
const url = request.nextUrl.clone();
122109
url.pathname = '/contributions/overview';
123-
const response = NextResponse.redirect(url, 301);
124-
response.headers.set('X-Robots-Tag', 'noindex, nofollow');
125-
return response;
110+
return NextResponse.redirect(url, 301);
126111
}
127112

128113
// Handle language-prefixed contribution redirects: /es/contributions
@@ -131,9 +116,7 @@ export function middleware(request) {
131116
if (supportedLanguages.includes(lang)) {
132117
const url = request.nextUrl.clone();
133118
url.pathname = `/${lang}/contributions/overview`;
134-
const response = NextResponse.redirect(url, 301);
135-
response.headers.set('X-Robots-Tag', 'noindex, nofollow');
136-
return response;
119+
return NextResponse.redirect(url, 301);
137120
}
138121
}
139122

@@ -150,10 +133,7 @@ export function middleware(request) {
150133
if (redirectMap[pathname]) {
151134
const url = request.nextUrl.clone();
152135
url.pathname = redirectMap[pathname];
153-
const response = NextResponse.redirect(url, 301);
154-
// Prevent search engines from indexing redirect URLs
155-
response.headers.set('X-Robots-Tag', 'noindex, nofollow');
156-
return response;
136+
return NextResponse.redirect(url, 301);
157137
}
158138

159139
return NextResponse.next();

SortVision/src/App.jsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -615,9 +615,6 @@ const MainContent = () => {
615615
/>
616616
</Footer>
617617

618-
{/* SEO Content for better search engine understanding */}
619-
{/* SEOContent removed - SEO handled by Next.js App Router */}
620-
621618
{/* Star on GitHub Popup */}
622619
<StarOnGithubPopup />
623620

0 commit comments

Comments
 (0)