This is an automated email from the ASF dual-hosted git repository.

Yilialinn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-website.git


The following commit(s) were added to refs/heads/master by this push:
     new 2c97d6cbdea fix(seo): improve APISIX core search visibility and 
metadata (#2127)
2c97d6cbdea is described below

commit 2c97d6cbdea834e770b0980d4a99721dd6e14a29
Author: Yilia Lin <[email protected]>
AuthorDate: Wed Sep 23 16:55:15 2026 +0800

    fix(seo): improve APISIX core search visibility and metadata (#2127)
---
 blog/en/blog/2025/03/06/what-is-an-ai-gateway.md   |  8 ++-
 doc/seo/semrush-on-page-seo-register.md            | 35 +++++++++++
 next/src/components/CollectionPages.astro          |  5 +-
 next/src/components/MainPages/AiGatewayPage.astro  | 14 +++++
 next/src/layouts/DocPage.astro                     |  2 +-
 next/src/lib/content.ts                            | 67 ++++++++++++++++++++--
 next/src/pages/learning-center/index.astro         |  5 +-
 next/tests/e2e/main-pages.spec.mjs                 | 42 +++++++++++++-
 next/tests/e2e/seo-signals.spec.mjs                | 59 +++++++++++++++++++
 .../api-gateway-for-microservices.md               |  2 +-
 website/learning-center/api-gateway-security.md    |  4 +-
 .../api-gateway-vs-load-balancer.md                |  2 +-
 website/learning-center/what-is-an-api-gateway.md  |  4 +-
 website/learning-center/what-is-grpc.md            |  2 +-
 website/learning-center/what-is-mutual-tls.md      |  4 +-
 15 files changed, 232 insertions(+), 23 deletions(-)

diff --git a/blog/en/blog/2025/03/06/what-is-an-ai-gateway.md 
b/blog/en/blog/2025/03/06/what-is-an-ai-gateway.md
index a2856fce72c..c963db885e8 100644
--- a/blog/en/blog/2025/03/06/what-is-an-ai-gateway.md
+++ b/blog/en/blog/2025/03/06/what-is-an-ai-gateway.md
@@ -18,7 +18,7 @@ keywords:
   - data security
   - AI traffic optimization
   - hybrid cloud architecture
-description: "Learn what an AI Gateway is and how Apache APISIX can manage LLM 
API traffic, model routing, token limits, security, and observability."
+description: "Learn how an AI gateway manages LLM traffic with provider 
integrations, model routing, token limits, security, semantic caching, and 
observability."
 tags: [Ecosystem]
 image: 
https://static.api7.ai/uploads/2025/03/07/1W9olFmu_what-is-ai-gateway.webp
 ---
@@ -55,7 +55,9 @@ These controls can reduce the amount of provider-specific 
failover logic in appl
 
 Request counts alone do not describe LLM usage. A short completion and a long 
completion can have very different token consumption. Token-aware limits allow 
teams to place a usage boundary in front of model providers.
 
-The APISIX 
[`ai-rate-limiting`](https://apisix.apache.org/docs/apisix/plugins/ai-rate-limiting/)
 plugin tracks token consumption and can use local or Redis-backed counters. It 
enforces the limits that operators configure; pricing, budgets, and billing 
reconciliation remain responsibilities of external systems.
+The APISIX 
[`ai-rate-limiting`](https://apisix.apache.org/docs/apisix/plugins/ai-rate-limiting/)
 plugin tracks token consumption and can use local or Redis-backed counters. 
Provider-reported usage may be recorded after the response, so concurrent 
requests can overshoot a fixed window; treat this as a usage limit rather than 
a prepaid hard budget. Pricing, budgets, and billing reconciliation remain 
responsibilities of external systems. See the [shared Redis token quota 
cookbook](/cookbook [...]
+
+Semantic caching is an optional, release- and provider-specific optimization 
rather than a universal gateway capability. In current Apache APISIX 
documentation, semantic matching is limited to plain-text OpenAI Chat requests; 
tool calls and multimodal inputs are not supported. See the [Redis AI cache 
cookbook](/cookbooks/redis-ai-cache/) for the supported flow and isolation 
considerations.
 
 ### Prompt and Content Processing
 
@@ -66,7 +68,7 @@ AI gateways can modify or inspect request and response 
content through separate,
 - 
[`ai-prompt-guard`](https://apisix.apache.org/docs/apisix/plugins/ai-prompt-guard/)
 allows or denies prompts using configured regular-expression patterns.
 - 
[`ai-aws-content-moderation`](https://apisix.apache.org/docs/apisix/plugins/ai-aws-content-moderation/)
 and 
[`ai-aliyun-content-moderation`](https://apisix.apache.org/docs/apisix/plugins/ai-aliyun-content-moderation/)
 integrate with their documented provider-specific moderation services.
 
-These plugins provide specific controls, not a complete security or compliance 
guarantee. Teams still need application authorization, data classification, 
secrets management, provider governance, and human review where required.
+These plugins provide specific controls, not a complete security or compliance 
guarantee. Teams still need application authorization, data classification, 
secrets management, provider governance, and human review where required. For a 
broader defense-in-depth checklist, see [API gateway security best 
practices](/learning-center/api-gateway-security/).
 
 ### Retrieval-Augmented Generation
 
diff --git a/doc/seo/semrush-on-page-seo-register.md 
b/doc/seo/semrush-on-page-seo-register.md
new file mode 100644
index 00000000000..38ebf0185d7
--- /dev/null
+++ b/doc/seo/semrush-on-page-seo-register.md
@@ -0,0 +1,35 @@
+# Semrush On-page SEO Register
+
+本登记表把 Semrush desktop/mobile 
报告转成可执行的页面决策。报告中的建议是分析证据,不是需要机械执行的指令;真实搜索意图、Apache APISIX 技术准确性和页面职责优先。
+
+来源:`ideas_apisix.apache.org_20260922-desktop.xlsx`(155 条建议)和 
`ideas_apisix.apache.org_20260922-phone.xlsx`(154 条建议)。两份报告覆盖相同的 16 个 URL、29 
个关键词。本轮将外链、Core Web Vitals 和服务器性能建议留给后续工作流。
+
+| URL | 设备 | 关键词/主题 | 问题类型 | 真实搜索意图 | 处理决定 | 目标 title / H1 / meta description 
| 状态 |
+| --- | --- | --- | --- | --- | --- | --- | --- |
+| `/` | desktop + mobile | Apache APISIX API gateway;open source API gateway | 
title、H1、正文、meta、Schema | 了解并评估开源 API 网关 | 保留已对齐的首页定位;AI Gateway 作为次级入口;不添加评分标记 
| `Apache APISIX - Open Source API Gateway & AI Gateway` / `The open-source API 
Gateway & AI Gateway` / `Apache APISIX is a dynamic, high-performance, 
open-source API gateway and AI gateway...` | 已复核 |
+| `/ai-gateway/` | desktop + mobile | open source AI gateway;LLM gateway | 
title、H1、正文、内部链接 | 评估 LLM/AI agent 网关能力 | 保留产品页定位,补充 AI Gateway 解释型文章和 Learning 
Center 路径 | `Open-Source AI Gateway for LLMs and AI Agents | Apache APISIX` / 
同名 H1 / 覆盖 model routing、fallback、token rate limiting、security、observability | 
已完成 |
+| `/learning-center/` | desktop + mobile | API gateway guides;Apache APISIX 
tutorials;API gateway security/authentication | title、H1、meta | 学习 API 网关概念和实践 
| 将版本/下载意图交给 `/downloads/`,首页聚焦指南和教程 | `API Gateway Guides & Tutorials | Apache 
APISIX` / `API Gateway Guides & Tutorials` / `Apache APISIX guides to API 
gateway concepts, authentication, security, Kubernetes, and gateway 
comparisons.` | 已完成 |
+| `/learning-center/api-gateway-vs-load-balancer/` | desktop + mobile | api 
gateway vs load balancer | 首段、语义词、可读性 | 比较两种流量组件的职责边界 | 只保留一个主目标词;首段和比较表使用自然定义 
| `API Gateway vs Load Balancer: Key Differences Explained` / 同名 H1 / 现有比较型 
description | 已完成 |
+| `/learning-center/api-gateway-for-microservices/` | desktop + mobile | API 
gateway for microservices;API gateway architecture | title、首段、正文、可读性 | 
设计微服务网关架构 | 补充 service discovery、high-traffic REST API、traffic 
control、gateway/service mesh 边界 | `API Gateway for Microservices: Architecture, 
Patterns & Best Practices` / 同名 H1 / 现有架构型 description | 已完成 |
+| `/learning-center/what-is-an-api-gateway/` | desktop + mobile | what is an 
API gateway | 重复、首段、内部链接 | 获取 API 网关定义、工作方式和适用场景 | 用 
routing、authentication、rate limiting、observability 等变体降低重复;链接 AI Gateway | 
`What is an API Gateway? Definition, Benefits & Use Cases` / 同名 H1 / 现有定义型 
description | 已完成 |
+| `/learning-center/api-gateway-security/` | desktop + mobile | API gateway 
security best practices | 首段、语义词、可读性 | 学习 API 网关安全控制 | 补充 sensitive data、API 
endpoints、unauthorized access、incoming requests、RBAC;不强行堆叠 `api security 
gateway` | `API Gateway Security Best Practices` / 同名 H1 / 现有安全实践 description | 
已完成 |
+| `/learning-center/what-is-mutual-tls/` | desktop + mobile | what is mutual 
TLS;mTLS authentication | title、meta、正文、重复 | 了解双向 TLS 身份认证和证书校验 | 补充 public 
key、TLS certificate、client certificate、certificate validation,减少 mTLS 重复 | 
`What Is Mutual TLS (mTLS)? Authentication and Certificates` / 同名 H1 / 现有证书型 
description | 已完成 |
+| `/learning-center/what-is-grpc/` | desktop + mobile | what is gRPC | 
语义词、正文、视频 | 理解 gRPC、Protobuf、HTTP/2 和 streaming | 补充 gRPC clients、Protocol 
Buffers、data structures;无真实视频资产则不嵌入视频 | `What is gRPC? Protocol Buffers, 
Performance & API Gateway Integration` / 同名 H1 / 现有 gRPC description | 已完成 |
+| `/blog/2025/03/06/what-is-an-ai-gateway/` | desktop + mobile | AI gateway | 
title、首段、正文、内部链接 | 解释 AI Gateway 的概念和核心能力 | 补充 API key、real-time 
traffic、sensitive data、RBAC、semantic caching、provider integrations;链接产品页和安全指南 | 
`What Is an AI Gateway? Concept and Core Features | Apache APISIX` / 同名 H1 / 
`Learn how an AI gateway manages LLM traffic with provider integrations, model 
routing, token limits, security, semantic caching, and observability.` | 已完成 |
+| `/docs/apisix/FAQ/` | desktop + mobile | apisix ingress(疑似蚕食) | 
title、meta、关键词匹配 | 查找 APISIX 常见问题 | 用 FAQ 的真实职责覆盖 API gateway 
routing、authentication、plugins、configuration、troubleshooting;不引入正文未覆盖的 Ingress 
意图 | `Apache APISIX FAQ: API Gateway Questions | Apache APISIX` / `Apache 
APISIX FAQ: API Gateway Questions` / FAQ 主题 description | 已完成 |
+| `/docs/ingress-controller/concepts/gateway-api/` | desktop + mobile | 
Gateway API | title、meta、误匹配 | 学习 Kubernetes Gateway API 与 APISIX Ingress 
Controller | 只按文档主题优化,不追逐 Semrush 拼写近似词 | `Kubernetes Gateway API with APISIX 
Ingress Controller | Apache APISIX` / 同名主题 H1 / Gateway API 资源说明 | 待最终 overlay 
验证 |
+| `/docs/apisix/http3/` | desktop + mobile | HTTP/3;QUIC | title、meta、误匹配 | 
配置和理解 HTTP/3/QUIC | 说明 transport、TLS 和配置注意事项 | `HTTP/3 and QUIC in Apache 
APISIX | Apache APISIX` / `HTTP/3 and QUIC in Apache APISIX` / HTTP/3 配置 
description | 已完成 |
+| `/docs/apisix/plugins/lago/` | desktop + mobile | lagosec(误匹配) | 
title、meta、关键词匹配 | 配置 Lago 用量/计费插件 | 不添加 `lagosec`;按插件功能提供准确 metadata | `Lago 
Plugin | Apache APISIX` / `Lago Plugin` / Lago 用量和计费事件 description | 已完成 |
+| `/docs/apisix/plugins/ext-plugin-post-resp/` | desktop + mobile | 
ext.to(误匹配) | title、meta、关键词匹配 | 配置响应阶段外部插件 | 不添加 `ext.to`;按 Plugin Runner 和 
response phase 定义 metadata | `ext-plugin-post-resp | Apache APISIX` / 
`ext-plugin-post-resp` / 外部响应阶段插件 description | 已完成 |
+| `/docs/ingress-controller/reference/apisix-ingress-controller/annotation/` | 
desktop + mobile | cors proxy base64 url endpoint(误匹配) | title、meta、关键词匹配 | 查找 
Ingress Controller annotation 参数 | 不污染页面;覆盖 annotation、routing、CORS、proxy 和 
request behavior | `APISIX Ingress Controller Annotation Reference | Apache 
APISIX` / 同名主题 H1 / annotation reference description | 待最终 overlay 验证 |
+
+## 拒绝或延后
+
+| 建议类别 | 处理决定 | 原因 |
+| --- | --- | --- |
+| 获取外链/反向链接(desktop 29 条、mobile 29 条) | 延后 | 属于 off-page SEO,不改变本轮页面意图和内容质量。 |
+| `yapix`、`apizel`、`apjax`、`ext.to`、`lagosec` | 拒绝 | 与 APISIX 
页面主题不匹配,疑似拼写相似或低质量匹配;加入会造成关键词污染。 |
+| `cors proxy base64 url endpoint` | 拒绝 | 不是 annotation 
文档的真实搜索意图,不能为了覆盖报告词组破坏文档可读性。 |
+| 视频嵌入建议 | 延后 | 只有在有真实、可维护且与页面直接相关的视频资产时才加入。 |
+| `aggregateRating` | 拒绝 | 当前没有可验证、可持续维护的评分来源;保留 
WebSite、Organization、Article/BlogPosting、BreadcrumbList、FAQPage 等有依据的标记。 |
+| 版本发布/下载关键词放在 Learning Center 首页 | 拒绝 | 版本和下载意图由 `/downloads/` 
承接,避免学习中心与下载页蚕食。 |
diff --git a/next/src/components/CollectionPages.astro 
b/next/src/components/CollectionPages.astro
index 7ad7e7031c7..d2043dfbf55 100644
--- a/next/src/components/CollectionPages.astro
+++ b/next/src/components/CollectionPages.astro
@@ -13,6 +13,7 @@ interface Props {
   posts: Post[];
   urlBase: string; // e.g. "/learning-center"
   heading: string;
+  title?: string;
   sub?: string;
   kicker?: string;
   withTags?: boolean;
@@ -20,7 +21,7 @@ interface Props {
   linkPrefix?: string;
 }
 const {
-  locale, page, posts, urlBase, heading, sub, kicker, withTags = false, 
linkPrefix,
+  locale, page, posts, urlBase, heading, title, sub, kicker, withTags = false, 
linkPrefix,
 } = Astro.props;
 const prefix = localePrefix(locale);
 // Where the archive/tags/pagination siblings live. Normally alongside this
@@ -31,7 +32,7 @@ const pages = paginate(posts);
 const pagePosts = pages[page - 1] ?? [];
 ---
 <ListPage
-  title={heading}
+  title={title ?? heading}
   heading={heading}
   sub={sub}
   kicker={kicker}
diff --git a/next/src/components/MainPages/AiGatewayPage.astro 
b/next/src/components/MainPages/AiGatewayPage.astro
index d9e9a649f3c..0c9f63a390f 100644
--- a/next/src/components/MainPages/AiGatewayPage.astro
+++ b/next/src/components/MainPages/AiGatewayPage.astro
@@ -5,6 +5,11 @@ import { SITE, localePrefix, t, type Locale } from 
'../../lib/site';
 interface Props { locale: Locale }
 const { locale } = Astro.props;
 const p = localePrefix(locale);
+// The Learning Center article currently has no localized route, so keep the
+// Chinese product page's learning link pointed at the existing English page.
+const learningGuideHref = locale === 'zh'
+  ? '/learning-center/mcp-protocol-ai-gateway/'
+  : `${p}/learning-center/mcp-protocol-ai-gateway/`;
 
 const features = [
   {
@@ -319,6 +324,15 @@ const description = t(
         <a class="text-link" 
href={`${p}/blog/2025/02/24/apisix-ai-gateway-features/`}>
           {t(locale, 'See the AI Gateway capabilities', '了解 AI 网关能力')} <span 
aria-hidden="true">→</span>
         </a>
+        <a class="text-link" 
href={`${p}/blog/2025/03/06/what-is-an-ai-gateway/`}>
+          {t(locale, 'What is an AI gateway?', '什么是 AI 网关?')} <span 
aria-hidden="true">→</span>
+        </a>
+        <a class="text-link" href={learningGuideHref}>
+          {t(locale, 'Read the AI Gateway learning guide', '阅读 AI 网关学习指南')} 
<span aria-hidden="true">→</span>
+        </a>
+        <a class="text-link" href={`${p}/docs/apisix/plugins/ai-proxy/`}>
+          {t(locale, 'Explore the AI proxy plugin docs', '查看 AI 代理插件文档')} 
<span aria-hidden="true">→</span>
+        </a>
       </div>
       <img
         src="/img/ai-gateway/providers.avif"
diff --git a/next/src/layouts/DocPage.astro b/next/src/layouts/DocPage.astro
index 145d4f2dd01..724a3d5f36f 100644
--- a/next/src/layouts/DocPage.astro
+++ b/next/src/layouts/DocPage.astro
@@ -43,7 +43,7 @@ const jsonLd = [{
  * edition of the same hub, so zh pages canonicalise there instead.
  */
 const ZH_HUB = 'https://docs.apiseven.com';
-const rawCanonical = entry.mod.frontmatter.canonical;
+const rawCanonical = entry.canonical ?? entry.mod.frontmatter.canonical;
 const canonicalOverride = locale === 'zh'
   ? rawCanonical?.startsWith('https://docs.api7.ai/')
     ? rawCanonical.replace('https://docs.api7.ai', ZH_HUB)
diff --git a/next/src/lib/content.ts b/next/src/lib/content.ts
index 94c5cebdcf2..a076f5b588d 100644
--- a/next/src/lib/content.ts
+++ b/next/src/lib/content.ts
@@ -260,6 +260,8 @@ export interface DocEntry {
   url: string;
   title: string;
   description: string;
+  /** Cross-site canonical inherited from the English source when a translated 
page omits it. */
+  canonical?: string;
   mod: MdModule;
 }
 
@@ -306,6 +308,57 @@ function docTitle(mod: MdModule, id: string): string {
   return mod.frontmatter.title ?? id.split('/').pop()!;
 }
 
+/**
+ * Site-level metadata for a small set of high-value docs whose upstream
+ * titles are implementation-oriented or too generic for search results.
+ * These overrides affect the current Astro docs surface only; the synced
+ * source files remain untouched so the next docs refresh does not erase the
+ * intent mapping. Chinese translations keep their own authored metadata.
+ */
+const SEO_DOC_OVERRIDES: Record<string, { title: string; description: string 
}> = {
+  'apisix/FAQ': {
+    title: 'Apache APISIX FAQ: API Gateway Questions',
+    description: 'Answers to common Apache APISIX questions about API gateway 
routing, authentication, plugins, configuration, and troubleshooting.',
+  },
+  'apisix/http3': {
+    title: 'HTTP/3 and QUIC in Apache APISIX',
+    description: 'Learn how Apache APISIX supports HTTP/3 and QUIC, including 
transport behavior, TLS requirements, and configuration considerations.',
+  },
+  'apisix/plugins/lago': {
+    title: 'Lago Plugin',
+    description: 'Configure the Apache APISIX Lago plugin to report API usage 
and billing events to Lago.',
+  },
+  'apisix/plugins/ext-plugin-post-resp': {
+    title: 'ext-plugin-post-resp',
+    description: 'Configure ext-plugin-post-resp to run an external 
response-phase plugin through the Apache APISIX Plugin Runner.',
+  },
+  'ingress-controller/concepts/gateway-api': {
+    title: 'Kubernetes Gateway API with APISIX Ingress Controller',
+    description: 'Use Kubernetes Gateway API resources with the Apache APISIX 
Ingress Controller to manage gateways, listeners, routes, and backend 
services.',
+  },
+  'ingress-controller/reference/apisix-ingress-controller/annotation': {
+    title: 'APISIX Ingress Controller Annotation Reference',
+    description: 'Reference for APISIX Ingress Controller annotations, 
including routing, CORS, proxy, and request behavior settings.',
+  },
+};
+
+function docMetadata(
+  key: string,
+  mod: MdModule,
+  locale: Locale,
+  hasTranslation: boolean,
+  id: string,
+): { title: string; description: string } {
+  const authored = {
+    title: docTitle(mod, id),
+    description: mod.frontmatter.description ?? excerpt(mod),
+  };
+  // A translated page owns its own title and description. If Chinese falls
+  // back to English, use the English SEO mapping rather than the raw filename.
+  if (locale === 'zh' && hasTranslation) return authored;
+  return SEO_DOC_OVERRIDES[key] ?? authored;
+}
+
 export function getGeneralDocs(locale: Locale): DocEntry[] {
   return Object.entries(docsGeneralModules)
     .filter(([p]) => !p.endsWith('sidebars.json'))
@@ -335,14 +388,17 @@ export function getApisixDocs(locale: Locale): DocEntry[] 
{
     const hasTranslation = isMeaningfulTranslation(mod, zhMod);
     const translated = locale === 'zh' && hasTranslation ? zhMod : undefined;
     const effective = translated ?? mod;
+    const metadata = docMetadata(`apisix/${id}`, effective, locale, 
hasTranslation, id);
+    const canonical = effective.frontmatter.canonical ?? 
mod.frontmatter.canonical;
     return {
       id,
       pathId,
       sourceLocale: translated ? 'zh' : 'en',
       hasTranslation,
       url: `${localePrefix(locale)}/docs/apisix/${id}/`,
-      title: docTitle(effective, id),
-      description: effective.frontmatter.description ?? excerpt(effective),
+      title: metadata.title,
+      description: metadata.description,
+      canonical,
       mod: effective,
     };
   });
@@ -363,14 +419,17 @@ export function getSubprojectDocs(project: string, 
locale: Locale): DocEntry[] {
       const hasTranslation = isMeaningfulTranslation(mod, zhMod);
       const translated = locale === 'zh' && hasTranslation ? zhMod : undefined;
       const effective = translated ?? mod;
+      const metadata = docMetadata(`${project}/${id}`, effective, locale, 
hasTranslation, id);
+      const canonical = effective.frontmatter.canonical ?? 
mod.frontmatter.canonical;
       return {
         id,
         pathId,
         sourceLocale: (translated ? 'zh' : 'en') as Locale,
         hasTranslation,
         url: `${localePrefix(locale)}/docs/${project}/${id}/`,
-        title: docTitle(effective, id),
-        description: effective.frontmatter.description ?? excerpt(effective),
+        title: metadata.title,
+        description: metadata.description,
+        canonical,
         mod: effective,
       };
     });
diff --git a/next/src/pages/learning-center/index.astro 
b/next/src/pages/learning-center/index.astro
index 79498f59306..ec769a748d8 100644
--- a/next/src/pages/learning-center/index.astro
+++ b/next/src/pages/learning-center/index.astro
@@ -7,8 +7,9 @@ import { getLearningPosts } from '../../lib/content';
   page={1}
   posts={getLearningPosts()}
   urlBase="/learning-center"
-  heading="Learning Center"
+  heading="API Gateway Guides & Tutorials"
+  title="API Gateway Guides & Tutorials"
   kicker="Learning Center"
-  sub="Guides to API gateway concepts, security, Kubernetes, and gateway 
comparisons."
+  sub="Apache APISIX guides to API gateway concepts, authentication, security, 
Kubernetes, and gateway comparisons."
   withTags
 />
diff --git a/next/tests/e2e/main-pages.spec.mjs 
b/next/tests/e2e/main-pages.spec.mjs
index 351b68568ad..87cc96fa392 100644
--- a/next/tests/e2e/main-pages.spec.mjs
+++ b/next/tests/e2e/main-pages.spec.mjs
@@ -127,7 +127,7 @@ test('AI Gateway has complete responsive content and valid 
footer links', async
   await Promise.all(documentedPlugins.map((plugin) => (
     expect(page.locator(`main 
a[href="/docs/apisix/plugins/${plugin}/"]`).first()).toBeVisible()
   )));
-  await expect(page.locator('main 
a[href="/blog/2025/03/06/what-is-an-ai-gateway/"]'))
+  await expect(page.locator('main 
a[href="/blog/2025/03/06/what-is-an-ai-gateway/"]').first())
     .toBeVisible();
   await expect(page.locator('main 
a[href="/blog/2025/03/21/ai-gateway-vs-api-gateway-differences-explained/"]'))
     .toBeVisible();
@@ -156,6 +156,44 @@ test('AI Gateway has complete responsive content and valid 
footer links', async
 
   await expect(page.locator('footer 
a[href="/docs/general/events/"]')).toHaveText('Events');
   await expect(page.locator('footer a[href="/user-stories/"]')).toHaveCount(0);
+  await expect(page.getByRole('link', { name: /What is an AI gateway/i }))
+    .toHaveAttribute('href', '/blog/2025/03/06/what-is-an-ai-gateway/');
+  await expect(page.getByRole('link', { name: 'Read the AI Gateway learning 
guide' }))
+    .toHaveAttribute('href', '/learning-center/mcp-protocol-ai-gateway/');
+  await expect(page.getByRole('link', { name: 'Explore the AI proxy plugin 
docs' }))
+    .toHaveAttribute('href', '/docs/apisix/plugins/ai-proxy/');
+});
+
+test('Learning Center and AI Gateway article expose aligned search metadata', 
async ({ page }) => {
+  await page.goto('/learning-center/');
+  await expect(page).toHaveTitle('API Gateway Guides & Tutorials | Apache 
APISIX');
+  await expect(page.locator('meta[name="description"]')).toHaveAttribute(
+    'content',
+    'Apache APISIX guides to API gateway concepts, authentication, security, 
Kubernetes, and gateway comparisons.',
+  );
+  await expect(page.getByRole('heading', { level: 1, name: 'API Gateway Guides 
& Tutorials' })).toBeVisible();
+
+  await page.goto('/learning-center/what-is-an-api-gateway/');
+  await expect(page).toHaveTitle('What is an API Gateway? Definition, Benefits 
& Use Cases | Apache APISIX');
+  await 
expect(page.locator('meta[name="description"]')).toHaveAttribute('content', 
/API Gateway/);
+  await expect(page.getByRole('link', { name: /AI gateway/i }).first())
+    .toHaveAttribute('href', '/ai-gateway/');
+
+  await page.goto('/blog/2025/03/06/what-is-an-ai-gateway/');
+  await expect(page).toHaveTitle('What Is an AI Gateway? Concept and Core 
Features | Apache APISIX');
+  await expect(page.locator('meta[name="description"]')).toHaveAttribute(
+    'content',
+    'Learn how an AI gateway manages LLM traffic with provider integrations, 
model routing, token limits, security, semantic caching, and observability.',
+  );
+  await expect(page.getByRole('link', { name: 'Apache APISIX AI Gateway' 
})).toHaveAttribute('href', '/ai-gateway/');
+  await expect(page.getByRole('link', { name: 'API gateway security best 
practices' }))
+    .toHaveAttribute('href', '/learning-center/api-gateway-security/');
+});
+
+test('Chinese AI Gateway keeps English-only learning links resolvable', async 
({ page }) => {
+  await page.goto('/zh/ai-gateway/');
+  await expect(page.getByRole('link', { name: '阅读 AI 网关学习指南' }))
+    .toHaveAttribute('href', '/learning-center/mcp-protocol-ai-gateway/');
 });
 
 test('Chinese AI Gateway preserves localized ownership and documented 
capabilities', async ({ page }) => {
@@ -173,7 +211,7 @@ test('Chinese AI Gateway preserves localized ownership and 
documented capabiliti
   await expect(page.locator('link[rel="canonical"]'))
     .toHaveAttribute('href', 'https://apisix.apache.org/zh/ai-gateway/');
   await expect(page.locator('main 
a[href="/zh/docs/apisix/plugins/ai-proxy/"]').first()).toBeVisible();
-  await expect(page.locator('main 
a[href="/zh/blog/2025/03/06/what-is-an-ai-gateway/"]'))
+  await expect(page.locator('main 
a[href="/zh/blog/2025/03/06/what-is-an-ai-gateway/"]').first())
     .toBeVisible();
   await expect(page.locator('main')).not.toContainText('MCP Gateway');
   await expect(page.locator('main')).not.toContainText('MCP support');
diff --git a/next/tests/e2e/seo-signals.spec.mjs 
b/next/tests/e2e/seo-signals.spec.mjs
index 01d59f54e1d..1243b3fc4d6 100644
--- a/next/tests/e2e/seo-signals.spec.mjs
+++ b/next/tests/e2e/seo-signals.spec.mjs
@@ -58,6 +58,65 @@ APISIX_OWNED_DOCS.forEach((path) => {
   });
 });
 
+test('selected APISIX docs use intent-specific SEO metadata', async ({ page }) 
=> {
+  const cases = [
+    {
+      path: '/docs/apisix/FAQ/',
+      title: 'Apache APISIX FAQ: API Gateway Questions | Apache APISIX',
+      description: 'Answers to common Apache APISIX questions about API 
gateway routing, authentication, plugins, configuration, and troubleshooting.',
+    },
+    {
+      path: '/docs/apisix/http3/',
+      title: 'HTTP/3 and QUIC in Apache APISIX | Apache APISIX',
+      description: 'Learn how Apache APISIX supports HTTP/3 and QUIC, 
including transport behavior, TLS requirements, and configuration 
considerations.',
+    },
+    {
+      path: '/docs/apisix/plugins/lago/',
+      title: 'Lago Plugin | Apache APISIX',
+      description: 'Configure the Apache APISIX Lago plugin to report API 
usage and billing events to Lago.',
+    },
+    {
+      path: '/docs/apisix/plugins/ext-plugin-post-resp/',
+      title: 'ext-plugin-post-resp | Apache APISIX',
+      description: 'Configure ext-plugin-post-resp to run an external 
response-phase plugin through the Apache APISIX Plugin Runner.',
+    },
+  ];
+
+  for (const entry of cases) {
+    await page.goto(entry.path);
+    await expect(page).toHaveTitle(entry.title);
+    await 
expect(page.locator('meta[name="description"]')).toHaveAttribute('content', 
entry.description);
+    await expect(page.getByRole('heading', { level: 1 
})).toHaveText(entry.title.replace(' | Apache APISIX', ''));
+  }
+});
+
+test('selected Ingress docs use intent-specific SEO metadata', async ({ page 
}) => {
+  test.skip(
+    process.env.EXPECT_DOCUSARUS_ROUTES !== 'true',
+    'Ingress Controller docs are synced only in the final overlaid tree',
+  );
+
+  const cases = [
+    {
+      path: '/docs/ingress-controller/concepts/gateway-api/',
+      title: 'Kubernetes Gateway API with APISIX Ingress Controller | Apache 
APISIX',
+      description: 'Use Kubernetes Gateway API resources with the Apache 
APISIX Ingress Controller to manage gateways, listeners, routes, and backend 
services.',
+    },
+    {
+      path: 
'/docs/ingress-controller/reference/apisix-ingress-controller/annotation/',
+      title: 'APISIX Ingress Controller Annotation Reference | Apache APISIX',
+      description: 'Reference for APISIX Ingress Controller annotations, 
including routing, CORS, proxy, and request behavior settings.',
+    },
+  ];
+
+  for (const entry of cases) {
+    await page.goto(entry.path);
+    await expect(page).toHaveTitle(entry.title);
+    await 
expect(page.locator('meta[name="description"]')).toHaveAttribute('content', 
entry.description);
+    await expect(page.getByRole('heading', { level: 1 
})).toHaveText(entry.title.replace(' | Apache APISIX', ''));
+  }
+});
+
 test('blog hreflang exists only for verified source pairs', async ({ page }) 
=> {
   const en = 
'https://apisix.apache.org/blog/2026/07/31/2026-jul-monthly-report/';
   const zh = 
'https://apisix.apache.org/zh/blog/2026/07/31/2026-jul-monthly-report/';
diff --git a/website/learning-center/api-gateway-for-microservices.md 
b/website/learning-center/api-gateway-for-microservices.md
index b15e88b2a7f..b829111435e 100644
--- a/website/learning-center/api-gateway-for-microservices.md
+++ b/website/learning-center/api-gateway-for-microservices.md
@@ -7,7 +7,7 @@ tags: [microservices, architecture, api-gateway]
 hide_table_of_contents: false
 ---
 
-Microservices architectures often use an [API 
gateway](/learning-center/what-is-an-api-gateway/) as a single entry point for 
API consumers and to route requests to the correct backend services. The 
gateway centralizes access control, authentication and authorization, protocol 
translation, rate limiting, and observability, so each microservice does not 
have to implement these cross-cutting concerns independently.
+Microservices architectures often use an [API 
gateway](/learning-center/what-is-an-api-gateway/) as a single entry point for 
API consumers and to route requests to the correct backend services. For 
high-traffic REST APIs, the gateway can keep a stable client-facing endpoint 
while it applies routing, load balancing, retries, and traffic control behind 
the scenes. It also centralizes access control, authentication and 
authorization, protocol translation, rate limiting, and observability, s [...]
 
 ## Why Microservices Need a Gateway
 
diff --git a/website/learning-center/api-gateway-security.md 
b/website/learning-center/api-gateway-security.md
index 387585fc745..6d19a87e6da 100644
--- a/website/learning-center/api-gateway-security.md
+++ b/website/learning-center/api-gateway-security.md
@@ -45,11 +45,11 @@ A defense-in-depth approach applies multiple security 
controls at the gateway la
 
 ### Authentication
 
-For routes that require identity, the gateway can verify credentials before 
forwarding a request. Common mechanisms include JWT validation, OAuth 2.0 token 
introspection, API key verification, and [mutual TLS 
(mTLS)](/learning-center/what-is-mutual-tls/) for service-to-service 
communication. Centralizing [API gateway 
authentication](/learning-center/api-gateway-authentication/) can reduce 
inconsistent edge enforcement, while explicitly public routes remain 
unauthenticated by design.
+For routes that require identity, the gateway can verify credentials before 
forwarding incoming requests. Common mechanisms include JWT validation, OAuth 
2.0 token introspection, API key verification, and [mutual TLS 
(mTLS)](/learning-center/what-is-mutual-tls/) for service-to-service 
communication. Centralizing [API gateway 
authentication](/learning-center/api-gateway-authentication/) can reduce 
inconsistent edge enforcement, while explicitly public routes remain 
unauthenticated by design.
 
 ### Authorization
 
-Beyond verifying identity, the gateway can enforce route-, consumer-, role-, 
attribute-, or scope-based access policies before forwarding a request. These 
gateway-level checks complement rather than replace authorization in the 
application: backend services must still verify resource ownership and other 
business rules to prevent BOLA.
+Beyond verifying identity, the gateway can enforce route-, consumer-, role-, 
attribute-, or scope-based access policies, including role-based access control 
(RBAC), before forwarding a request. These gateway-level checks complement 
rather than replace authorization in the application: backend services must 
still verify resource ownership and other business rules to prevent BOLA.
 
 ### Rate Limiting and Throttling
 
diff --git a/website/learning-center/api-gateway-vs-load-balancer.md 
b/website/learning-center/api-gateway-vs-load-balancer.md
index d184bd80b6a..a2ae752a18a 100644
--- a/website/learning-center/api-gateway-vs-load-balancer.md
+++ b/website/learning-center/api-gateway-vs-load-balancer.md
@@ -17,7 +17,7 @@ faq:
       Assign a bounded retry budget to the layer that has the best view of 
each failure boundary. Uncoordinated retries at both layers can multiply 
requests, increase latency, and replay operations that are not safe to repeat. 
Test timeout and retry behavior together under partial failures.
 ---
 
-A load balancer distributes traffic across healthy backend instances. An API 
gateway controls how clients use APIs through routing and policies such as 
authentication, rate limiting, transformation, and observability. Their 
capabilities overlap at Layer 7, but they solve different architectural 
problems. Many production systems use both: a network or cloud load balancer 
exposes a highly available gateway cluster, and the gateway applies API 
policies before balancing requests across services.
+A load balancer distributes incoming traffic across multiple healthy backend 
instances. An API gateway controls how clients use APIs through routing and 
policies such as authentication, rate limiting, transformation, and 
observability. Their capabilities overlap at Layer 7, but they solve different 
architectural problems. Many production systems use both: a network or cloud 
load balancer exposes a highly available gateway cluster, and the gateway 
applies API policies before balancing req [...]
 
 ## What Is a Load Balancer?
 
diff --git a/website/learning-center/what-is-an-api-gateway.md 
b/website/learning-center/what-is-an-api-gateway.md
index 487a123d917..1887ff8f43c 100644
--- a/website/learning-center/what-is-an-api-gateway.md
+++ b/website/learning-center/what-is-an-api-gateway.md
@@ -25,7 +25,7 @@ faq:
 
 An API gateway is a server that sits between clients and backend services, 
acting as an entry point for the APIs placed behind it. It accepts incoming 
requests, applies policies such as authentication, rate limiting, and 
transformation, then routes each request to the appropriate upstream service 
and returns the response to the caller.
 
-The main benefits of an API gateway are consistent edge policy enforcement, 
less duplicated infrastructure logic, and a stable entry point as backend 
services change. Teams can centralize access control, traffic shaping, and 
gateway-level observability while leaving business authorization and 
service-specific behavior in the applications that own them.
+The main benefits of an API gateway are consistent edge policy enforcement, 
less duplicated infrastructure logic, and a stable entry point as backend 
services change. Teams can centralize access control, traffic shaping, and 
gateway-level observability while leaving business authorization and 
service-specific behavior in the applications that own them. For teams routing 
LLM requests, an [AI gateway](/ai-gateway/) extends the same policy model to 
model providers and AI applications.
 
 ## How Does an API Gateway Work?
 
@@ -182,7 +182,7 @@ The gateway and backend services scale independently. 
During a traffic surge, te
 
 **Extensible policy layer.** The APISIX [plugin ecosystem](/plugins/) covers 
authentication, traffic control, observability, security, and transformation. 
Native plugins use Lua, while external plugin runners provide additional 
extension models where their operational tradeoffs are appropriate.
 
-**Dynamic configuration.** Routes match request attributes, execute configured 
plugins, and forward traffic to an upstream. In traditional and decoupled 
deployment modes, APISIX stores configuration in etcd and exposes an Admin API, 
allowing route, upstream, consumer, and plugin changes to propagate without 
restarting gateway processes. Standalone mode can instead load declarative 
configuration without etcd.
+**Dynamic configuration.** Routes match request attributes, execute configured 
plugins, and forward traffic to an upstream. In traditional and decoupled 
deployment modes, APISIX stores configuration in etcd and exposes an Admin API, 
allowing route, upstream, consumer, and plugin changes to propagate in real 
time without restarting gateway processes. Standalone mode can instead load 
declarative configuration without etcd.
 
 **Open governance.** Apache APISIX is an Apache Software Foundation top-level 
project developed under community governance and released under the Apache 
License 2.0.
 
diff --git a/website/learning-center/what-is-grpc.md 
b/website/learning-center/what-is-grpc.md
index 5050f2a9351..e7c4da251a1 100644
--- a/website/learning-center/what-is-grpc.md
+++ b/website/learning-center/what-is-grpc.md
@@ -40,7 +40,7 @@ message OrderResponse {
 }
 ```
 
-The `protoc` compiler generates client and server code in many languages from 
this definition. For many schemas, binary serialization produces more compact 
payloads than an equivalent JSON representation, but the exact size and 
processing cost depend on the data model and implementation.
+The `protoc` compiler, together with a language-specific gRPC plugin, 
generates gRPC clients and server code in many languages from this definition. 
The generated clients use the declared data structures and service methods, 
while the gateway can apply transport-level policies without changing the 
contract. For many schemas, binary serialization produces more compact payloads 
than an equivalent JSON representation, but the exact size and processing cost 
depend on the data model and imple [...]
 
 ### HTTP/2 Transport
 
diff --git a/website/learning-center/what-is-mutual-tls.md 
b/website/learning-center/what-is-mutual-tls.md
index ee46e88c2aa..6ba1579f9c2 100644
--- a/website/learning-center/what-is-mutual-tls.md
+++ b/website/learning-center/what-is-mutual-tls.md
@@ -1,5 +1,5 @@
 ---
-title: "Mutual TLS (mTLS): Authentication and Certificates"
+title: "What Is Mutual TLS (mTLS)? Authentication and Certificates"
 description: "Learn how mutual TLS (mTLS) authentication uses client and 
server certificates, how TLS vs mTLS differs, and how Apache APISIX enforces 
mTLS."
 slug: what-is-mutual-tls
 date: 2026-04-14
@@ -7,7 +7,7 @@ tags: [mtls, security, tls]
 hide_table_of_contents: false
 ---
 
-Mutual TLS (mTLS) authentication is a security protocol where both the client 
and server authenticate each other using X.509 digital certificates during the 
TLS handshake. Unlike standard TLS, which only verifies the server's identity, 
mTLS provides mutual authentication: both parties prove their identities before 
exchanging application data over a secure connection.
+Mutual TLS (mTLS) authentication is a security protocol where both the client 
and server authenticate each other using X.509 digital certificates during the 
TLS handshake. The certificate binds an identity to a public key, and each side 
verifies the peer's certificate chain before accepting the connection. Unlike 
standard TLS, which only verifies the server's identity, mTLS provides mutual 
authentication: both parties prove their identities before exchanging 
application data over a secur [...]
 
 ## Why Mutual TLS Matters
 

Reply via email to