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 是依據頁面回答問題的效果來挑選來源。內容仍然必須是對買家所問問題最清楚的回答。

逐步操作

  1. 檢查 robots. 新增允許 OAI-SearchBot 並指向 Sitemap 的 app/robots.ts;GPTBot 另外決定。
  2. 頁面維持在伺服器端. 確認每個公開頁面都是 Server Component,且主要文字在 HTML 中。
  3. 新增 metadata. 在每個頁面使用 generateMetadata,設定獨一無二的標題、描述、canonical 與語言替代連結。
  4. 新增 JSON-LD 與 Sitemap. 在頁面中算繪 JSON-LD,並把每個公開網址列在 app/sitemap.ts 中。
  5. 測試線上網站. 部署後執行 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 小時才會調整。

延伸閱讀

最後驗證日期 .

Next.js SEO:如何讓 ChatGPT 引用您的網站