Skip to content

Commit 797606c

Browse files
authored
fix: cleanup faq and seo metadata (#163)
* fix: cleanup faq and seo metadata * fix: localize static 404 page
1 parent 79b7fac commit 797606c

23 files changed

Lines changed: 428 additions & 401 deletions

.dockerignore

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
.git
2+
.github
3+
.agents
4+
.claude
5+
.cache
6+
.next
7+
.vscode
8+
node_modules
9+
out
10+
coverage
11+
12+
.DS_Store
13+
*.log
14+
*.tsbuildinfo
15+
16+
.env
17+
.env.*
18+
!.env.template

.github/workflows/fastgpt-home-image.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ jobs:
6464
NEXT_PUBLIC_RYBBIT_TONGJI=${{ secrets.NEXT_PUBLIC_RYBBIT_TONGJI }}
6565
NEXT_PUBLIC_RYBBIT_TONGJI_SITEID=${{ secrets.NEXT_PUBLIC_RYBBIT_TONGJI_SITEID }}
6666
NEXT_PUBLIC_CUSTOM_PLAN_URL=${{ secrets.NEXT_PUBLIC_CUSTOM_PLAN_URL }}
67-
NEXT_PUBLIC_FAQ=true
6867
NEXT_PUBLIC_DEFAULT_LOCALE=zh
6968
- uses: actions-hub/kubectl@master
7069
env:

Dockerfile

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ ARG NEXT_PUBLIC_POLICE_FILING
1616
ARG NEXT_PUBLIC_RYBBIT_TONGJI
1717
ARG NEXT_PUBLIC_RYBBIT_TONGJI_SITEID
1818
ARG NEXT_PUBLIC_CUSTOM_PLAN_URL
19-
ARG NEXT_PUBLIC_FAQ
2019
ARG NEXT_PUBLIC_DEFAULT_LOCALE
2120

2221
ENV NEXT_PUBLIC_BAIDU_TONGJI=$NEXT_PUBLIC_BAIDU_TONGJI
@@ -28,7 +27,6 @@ ENV NEXT_PUBLIC_POLICE_FILING=$NEXT_PUBLIC_POLICE_FILING
2827
ENV NEXT_PUBLIC_RYBBIT_TONGJI=$NEXT_PUBLIC_RYBBIT_TONGJI
2928
ENV NEXT_PUBLIC_RYBBIT_TONGJI_SITEID=$NEXT_PUBLIC_RYBBIT_TONGJI_SITEID
3029
ENV NEXT_PUBLIC_CUSTOM_PLAN_URL=$NEXT_PUBLIC_CUSTOM_PLAN_URL
31-
ENV NEXT_PUBLIC_FAQ=$NEXT_PUBLIC_FAQ
3230
ENV NEXT_PUBLIC_DEFAULT_LOCALE=${NEXT_PUBLIC_DEFAULT_LOCALE:-zh}
3331

3432
# copy packages and one project
@@ -47,6 +45,3 @@ LABEL org.opencontainers.image.source="https://github.com/labring/fastgpt-home"
4745

4846
COPY --from=builder /app/out /usr/share/nginx/html
4947
COPY nginx.conf /etc/nginx/conf.d/default.conf
50-
51-
# Copy IndexNow API Key for Bing/Yandex search engine indexing
52-
COPY public/ffbdd11b7b9110d3ec624f847c163084.txt /usr/share/nginx/html/

package-lock.json

Lines changed: 0 additions & 39 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"private": true,
55
"scripts": {
66
"dev": "next dev --turbopack",
7-
"prebuild": "node scripts/manage-faq-routes.js && node scripts/generate-robots.js",
7+
"prebuild": "node scripts/generate-robots.js",
88
"build": "next build && node scripts/clean-faq-rsc.js && node scripts/copy-root-index.js",
99
"start": "npx serve@latest out",
1010
"lint": "eslint \"src/**/*.{js,jsx,ts,tsx}\"",
@@ -17,7 +17,6 @@
1717
"@heroui/react": "^2.8.9",
1818
"@heroui/theme": "^2.4.26",
1919
"@radix-ui/react-slot": "^1.0.2",
20-
"@vercel/analytics": "^1.1.2",
2120
"autoprefixer": "^10.4.24",
2221
"class-variance-authority": "^0.7.0",
2322
"clsx": "^2.1.0",

public/_headers

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,4 @@
2727
Referrer-Policy: strict-origin-when-cross-origin
2828
Permissions-Policy: camera=(), microphone=(), geolocation=()
2929
Cross-Origin-Opener-Policy: same-origin-allow-popups
30-
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.googletagmanager.com *.baidu.com hm.baidu.com track.fastgpt.cn *.feishu.cn *.cloudflareinsights.com *.rybbit.io; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; connect-src 'self' *.fastgpt.io *.fastgpt.cn *.sealos.io *.googletagmanager.com *.google-analytics.com *.rybbit.io api.github.com *.vercel-insights.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; media-src 'self' https:;
30+
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.googletagmanager.com *.baidu.com hm.baidu.com track.fastgpt.cn *.feishu.cn cloudflareinsights.com *.cloudflareinsights.com rybbit.io *.rybbit.io www.clarity.ms *.clarity.ms; style-src 'self' 'unsafe-inline'; img-src 'self' data: https: blob:; font-src 'self' data:; connect-src 'self' *.fastgpt.io *.fastgpt.cn *.sealos.io *.googletagmanager.com *.google-analytics.com cloudflareinsights.com *.cloudflareinsights.com rybbit.io *.rybbit.io www.clarity.ms *.clarity.ms api.github.com; frame-ancestors 'none'; base-uri 'self'; form-action 'self'; media-src 'self' https:;

scripts/manage-faq-routes.js

Lines changed: 0 additions & 101 deletions
This file was deleted.

src/app/[lang]/faq/[id]/page.tsx

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,14 @@ import FAQCard from '@/components/faq/FAQCard';
88
import Navbar from '@/components/home/Navbar';
99
import HomeThemeFix from '@/components/home/HomeThemeFix';
1010
import GradientBlobs from '@/components/home/GradientBlobs';
11-
import { showFAQ } from '@/constants';
11+
import { BreadcrumbJsonLd, FAQJsonLd } from '@/components/JsonLd';
1212

1313
export default async function FAQDetailPage({
1414
params
1515
}: {
1616
params: Promise<{ lang?: string; id: string }>;
1717
}) {
1818
const { lang, id } = await params;
19-
if (!showFAQ) {
20-
notFound();
21-
}
22-
2319
const langName = lang || defaultLocale;
2420
const dict = await getDictionary(langName);
2521

@@ -35,9 +31,18 @@ export default async function FAQDetailPage({
3531
.slice(0, 4);
3632

3733
const paragraphs = faqItem.Answers.split('\n\n');
34+
const baseUrl = process.env.NEXT_PUBLIC_HOME_URL || 'https://fastgpt.io';
3835

3936
return (
4037
<div className="home overflow-x-hidden">
38+
<BreadcrumbJsonLd
39+
items={[
40+
{ name: dict.JsonLd.breadcrumbHome, url: `${baseUrl}/${langName}` },
41+
{ name: dict.FAQ?.title || 'FAQ', url: `${baseUrl}/${langName}/faq` },
42+
{ name: faqItem.Question, url: `${baseUrl}/${langName}/faq/${encodeURIComponent(id)}` }
43+
]}
44+
/>
45+
<FAQJsonLd items={[{ question: faqItem.Question, answer: faqItem.Answers }]} />
4146
<HomeThemeFix />
4247
<Navbar links={dict.links} t={dict.Home.navCta} />
4348

@@ -151,10 +156,6 @@ export default async function FAQDetailPage({
151156
}
152157

153158
export async function generateStaticParams() {
154-
if (!showFAQ) {
155-
return [];
156-
}
157-
158159
const faqKeys = Object.keys(faq);
159160
const languages = Object.keys(localeNames);
160161

@@ -169,13 +170,6 @@ export async function generateMetadata({
169170
params: Promise<{ lang?: string; id: string }>;
170171
}) {
171172
const { lang, id } = await params;
172-
if (!showFAQ) {
173-
return {
174-
title: 'Page Not Found',
175-
robots: { index: false, follow: false }
176-
};
177-
}
178-
179173
const langName = lang || defaultLocale;
180174
const faqItem = getFaqItem(id, langName);
181175

src/app/[lang]/faq/page.tsx

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,14 @@ import Navbar from '@/components/home/Navbar';
66
import HomeThemeFix from '@/components/home/HomeThemeFix';
77
import GradientBlobs from '@/components/home/GradientBlobs';
88
import FadeIn from '@/components/home/motion/FadeIn';
9-
import { notFound } from 'next/navigation';
10-
import { showFAQ } from '@/constants';
9+
import { BreadcrumbJsonLd, FAQJsonLd } from '@/components/JsonLd';
1110

1211
export default async function FAQPage({
1312
params
1413
}: {
1514
params: Promise<{ lang?: string }>;
1615
}) {
1716
const { lang } = await params;
18-
if (!showFAQ) {
19-
notFound();
20-
}
21-
2217
const langName = lang || defaultLocale;
2318
const dict = await getDictionary(langName);
2419

@@ -31,9 +26,21 @@ export default async function FAQPage({
3126
Answers: item.Answers.substring(0, 100),
3227
};
3328
}
29+
const baseUrl = process.env.NEXT_PUBLIC_HOME_URL || 'https://fastgpt.io';
30+
const faqSchemaItems = Object.values(faq).slice(0, 30).map((item) => ({
31+
question: item.Question,
32+
answer: item.Answers
33+
}));
3434

3535
return (
3636
<div className="home overflow-x-hidden">
37+
<BreadcrumbJsonLd
38+
items={[
39+
{ name: dict.JsonLd.breadcrumbHome, url: `${baseUrl}/${langName}` },
40+
{ name: dict.FAQ?.title || 'FAQ', url: `${baseUrl}/${langName}/faq` }
41+
]}
42+
/>
43+
<FAQJsonLd items={faqSchemaItems} />
3744
<HomeThemeFix />
3845
<Navbar links={dict.links} t={dict.Home.navCta} />
3946
<main className="pb-[80px] px-[16px] md:px-[32px] relative">
@@ -94,9 +101,6 @@ export default async function FAQPage({
94101
}
95102

96103
export async function generateStaticParams() {
97-
if (!showFAQ) {
98-
return [];
99-
}
100104
return Object.keys(localeNames).map((lang) => ({ lang }));
101105
}
102106

@@ -107,13 +111,6 @@ export async function generateMetadata({
107111
}: {
108112
params: Promise<{ lang?: string }>;
109113
}) {
110-
if (!showFAQ) {
111-
return {
112-
title: 'Page Not Found',
113-
robots: { index: false, follow: false }
114-
};
115-
}
116-
117114
const { lang } = await params;
118115
const langName = lang || defaultLocale;
119116
const dict = await getDictionary(langName);

src/app/[lang]/layout.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default async function LangHome({ children, params }: { children: React.R
1111

1212
return (
1313
<>
14-
<JsonLd lang={langName} />
14+
<JsonLd lang={langName} schema={dict.JsonLd} />
1515
<HomeLayoutSwitcher dict={dict}>{children}</HomeLayoutSwitcher>
1616
</>
1717
);

0 commit comments

Comments
 (0)