Next.js SEO:我要如何讓 ChatGPT 引用我的網站?
讓每個頁面在沒有 JavaScript 的情況下也能閱讀、清楚描述它,並允許 ChatGPT 的搜尋爬蟲進入。在 Next.js 中,這表示:文字要出現在 HTML 中的 Server Components、用 Metadata API 設定標題、canonical 與語言、允許 OAI-SearchBot 的 app/robots.ts、app/sitemap.ts,以及頁面中的 JSON-LD。這些都不能保證被引用;它們只是移除 ChatGPT 無法使用您頁面的原因。
重點事實
- OpenAI 表示,封鎖 OAI-SearchBot 的網站不會出現在 ChatGPT 搜尋的回答中,而 robots.txt 的變更約需 24 小時才會生效。 (OpenAI: Overview of OpenAI crawlers)
- OpenAI 表示,禁止 GPTBot 只代表內容不應用於訓練其模型;ChatGPT-User 的造訪是由使用者發起的,不會用來決定搜尋中出現什麼。 (OpenAI: Overview of OpenAI crawlers)
- Next.js 表示,metadata 匯出與 generateMetadata 自 v13.2.0 起可用,且只在 Server Components 中運作,因此 metadata 會出現在初始 HTML 中。 (Next.js 文件:generateMetadata)
- Next.js 自 v13.3.0 起支援以 app/robots.ts 產生 robots.txt,並可依使用者代理設定規則。 (Next.js 文件:robots.txt)
- Next.js 自 v14.2.0 起,app/sitemap.ts 支援替代語言網址;Google 對每個 Sitemap 的上限為 50,000 個網址。 (Next.js 文件:sitemap.xml)
我需要允許哪一個 OpenAI 爬蟲?
OAI-SearchBot 決定 ChatGPT 搜尋能否顯示您的網站。這三者的工作各不相同,因此請分別封鎖或允許:
// app/robots.ts
import type { MetadataRoute } from "next";
export default function robots(): MetadataRoute.Robots {
return {
rules: [
{ userAgent: "*", allow: "/" },
// ChatGPT 搜尋:必須允許,才能出現在回答中
{ userAgent: "OAI-SearchBot", allow: "/" },
// 模型訓練:由您決定,它不會影響搜尋
{ userAgent: "GPTBot", allow: "/" },
],
sitemap: "https://www.example.com/sitemap.xml",
};
}| 使用者代理 | 它做什麼 | 封鎖它的效果 |
|---|---|---|
| OAI-SearchBot | 為 ChatGPT 的搜尋功能檢索網站 | 您的頁面不會出現在 ChatGPT 搜尋的回答中 |
| GPTBot | 檢索可能用於訓練 OpenAI 模型的內容 | 內容不會用於訓練;搜尋不受影響 |
| ChatGPT-User | 在使用者的問題需要時造訪頁面 | robots.txt 可能不適用;它不決定搜尋結果 |
為什麼文字必須在伺服器算繪?
因為 ChatGPT 的爬蟲讀取您伺服器送出的 HTML,而且不執行 JavaScript。在 App Router 中,頁面預設是 Server Components;載入後才在 Client Component 中取得的文字,不會出現在那份 HTML 裡。請讓頁面保持為 Server Component,只把互動的部分移到標示 "use client" 的檔案中。
每個頁面的 metadata 應該包含什麼?
獨一無二的標題與描述、canonical 網址,以及在多語言網站上的語言替代連結。generateMetadata 會為每個頁面產生它們;Next.js 會把 alternates 轉成 rel="canonical" 與 hreflang 連結。JSON-LD 以一般 script 標籤放在頁面中,並依 Next.js 文件所示跳脫 "<",而且內容必須與可見文字一致。
// app/guides/[slug]/page.tsx(Server Component:沒有 "use client")
import type { Metadata } from "next";
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> {
const { slug } = await params;
const page = await getPage(slug);
return {
title: page.title,
description: page.description,
alternates: {
canonical: `/guides/${slug}`,
languages: { "pt-BR": `/pt/guides/${slug}`, es: `/es/guides/${slug}` },
},
};
}
export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
const { slug } = await params;
const page = await getPage(slug);
const jsonLd = { "@context": "https://schema.org", "@type": "Article", headline: page.title };
return (
<article>
<script type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd).replace(/</g, "\\u003c") }} />
<h1>{page.title}</h1>
<p>{page.answer}</p>
</article>
);
}我要如何像爬蟲一樣測試?
不使用瀏覽器,直接抓取線上頁面,查看答案文字、標題、canonical 與 JSON-LD。如果文字不在原始 HTML 中,ChatGPT 就無法引用它。
# 1. 文字位於原始 HTML 中(不執行 JavaScript) curl -s -A "OAI-SearchBot" https://www.example.com/guides/my-page | grep -i "答案中的一句話" # 2. 標題、canonical 與 JSON-LD 也都在 curl -s https://www.example.com/guides/my-page | grep -iE "<title>|rel=\"canonical\"|ld\+json" # 3. robots.txt 與 Sitemap 的回應 curl -s https://www.example.com/robots.txt curl -s https://www.example.com/sitemap.xml | grep -c "<loc>"
完美的設定就能被引用嗎?
不能。設定只會讓您的頁面可被閱讀且符合資格;ChatGPT 是依據頁面回答問題的效果來挑選來源。內容仍然必須是對買家所問問題最清楚的回答。
逐步操作
- 檢查 robots. 新增允許 OAI-SearchBot 並指向 Sitemap 的 app/robots.ts;GPTBot 另外決定。
- 頁面維持在伺服器端. 確認每個公開頁面都是 Server Component,且主要文字在 HTML 中。
- 新增 metadata. 在每個頁面使用 generateMetadata,設定獨一無二的標題、描述、canonical 與語言替代連結。
- 新增 JSON-LD 與 Sitemap. 在頁面中算繪 JSON-LD,並把每個公開網址列在 app/sitemap.ts 中。
- 測試線上網站. 部署後執行 curl 檢查,而不是在 localhost 上測試。
常見錯誤
- 只為了封鎖訓練用途,卻用同一條規則同時封鎖 GPTBot 與 OAI-SearchBot。
- 在 useEffect 中載入文章內容,使爬蟲拿到的 HTML 是空的。
- 從根版面配置為每個頁面複製相同的標題、描述或 canonical。
- JSON-LD 聲稱了可見頁面沒有提到的內容。
easyIndex 如何解決
easyIndex 很適合 Next.js 網站,因為工作仍留在您的儲存庫中:您的程式代理撰寫頁面,easyIndex 則透過 MCP 提供步驟,在提交時稽核每個頁面,並在線上網站檢查;步驟只有在 easyIndex 檢查到證據時才會完成,而不是依據代理的回報。
接著,儀表板會顯示每個頁面的 AI 助理造訪者,以及 AI 爬蟲讀取了哪些頁面。單一方案包含所有功能:每個網站每月 US$30,先有 7 天免費試用,且一個網站。
常見問題
我應該封鎖 GPTBot 嗎?
由您決定。OpenAI 表示 GPTBot 用於訓練,而 OAI-SearchBot 用於搜尋,因此只封鎖 GPTBot 不會讓您退出 ChatGPT 搜尋。
我需要 Pages Router 還是 App Router?
兩者都能送出伺服器算繪的 HTML。本指南使用 App Router,它的頁面預設是 Server Components,而且 Metadata API 就在這裡。
需要 llms.txt 嗎?
不需要。ChatGPT 搜尋會讀取您的頁面;llms.txt 檔案無法取代 HTML 中的文字。
robots.txt 的變更要多久才會生效?
OpenAI 表示,在 robots.txt 更新後,其搜尋系統約需 24 小時才會調整。
延伸閱讀
- ChatGPT 和 Claude 看得到我以 JavaScript 建置的網站嗎?
- 有哪些 AI 檢索器?我要如何在 robots.txt 中允許它們?
- 結構化資料(schema)能幫助 AI 引用我的網站嗎?
- 如何讓 ChatGPT 推薦我的公司?
- 要如何用 Claude Code 或 Codex 做 GEO?
- easyIndex 如何運作?我需要準備什麼?多久會有成效?
最後驗證日期 .